3

マクロ関数を定義する前に、それがまだ存在しないことを確認できます
(これにより、以前の定義が上書きされるのを回避できます)。

次のようにチェックと定義を実装できます。

#ifndef MACRO(X)
#define MACRO(X) FUNCTION(X)
#endif

またはこのように:

#ifndef MACRO
#define MACRO(X) FUNCTION(X)
#endif

関数が既に定義されている場合、どちらも機能するように見えます。
それで、どれが正しいですか?どちらが好ましいですか?

4

2 に答える 2

7

それなし。

標準で#ifndefは、 は と同等#if !definedであり、 への引数definedは (場合によっては括弧で囲まれた)識別子でなければならないことが規定されています。識別子に括弧を含めることはできないためdefined MACRO(X)、許可された形式ではありません。をこのように使用するとdefined、未定義の動作が発生するため、移植性がありません。

于 2016-02-02T01:50:36.680 に答える
2

括弧なし。この理由により:

test.c

#ifdef MACRO(x)
#endif
int main() {}

これをコンパイルしようとすると:

$ gcc test.c
test.c:2:13: 警告: #ifdef ディレクティブの末尾に余分なトークンがあります [デフォルトで有効]
 #ifdef MACRO(x)
             ^

警告を発します。

于 2016-02-02T01:54:09.207 に答える