3

標準のシステムコール(open、listenなど)のラッパーのセットが必要です。これらのために私は次のようにいくつかの「#define」を持っています:

#define open(a,b,c) JCL_Open(a,b,c)

しかし、ヘッダーと関連する.cファイルをコンパイルすると、次の警告が表示されます。

/jcl_wrappers.h:114:1:警告: "open"が再定義
されました/jcl_wrappers.h:113:1:警告:これは前の定義の場所です

これらの警告を抑制するにはどうすればよいですか?

4

4 に答える 4

5

ヘッダーファイルにインクルードガードを配置します。

基本的に、これらの2行をヘッダーファイルの先頭に配置する必要があります

#ifndef _yourincludefilename_h_
#define _yourincludefilename_h_

#endif /* _yourincludefilename_h_ */

最後にファイルをインクルードします。

編集:
rascherは正しいです。ライブラリ関数と競合するため、openはマクロの適切な名前ではありません。通常、マクロをすべて大文字にするのは良いC規則なので、マクロを次のように変更することをお勧めします。

#define OPEN(a,b,c) JCL_Open(a,b,c)

またはさらに良い

#define XYZ_OPEN(a,b,c) JCL_Open(a,b,c)

ここで、XYZはコードに固有のプレフィックスです。

于 2009-04-20T05:07:45.657 に答える
5

標準関数をそのままにして、関数の名前を変更します。

#define myopen(a,b,c) JCL_Open(a,b,c)

後で誰かがあなたに感謝します。

于 2009-04-20T05:09:04.140 に答える
1

コンパイル ガードを使用してみてください。お気に入り:

my_headers.h:

#ifndef __MY_HEADERS
#define __MY_HEADERS

  #define open(a,b,c) JCL_Open(a,b,c)

#endif

'__MY_HEADERS' マクロが定義されている場合、これは #ifndef と #endif の間にあることだけを行います。したがって、.h ファイル内のすべてが 1 回だけ宣言されます。

同じ構造を使用して、「open」マクロが既に定義されているかどうかを確認できます。

open() という名前の C 関数が既にあることにも注意してください: http://www.manpagez.com/man/2/open/。マクロに同じ名前を使用するのは良い考えではないかもしれません!

于 2009-04-20T05:10:18.647 に答える
0

定義を次のようにラップします。

#ifndef JCL_WRAPPERS_H
#define JCL_WRAPPERS_H

... your macro's

#endif

これにより、ヘッダーを複数の場所に含める場合に、マクロが1回だけ定義されるようになります。

一般に、ヘッダー内のすべてのプロトタイプに対しても賢明な方法です。

于 2009-04-20T05:08:00.180 に答える