1

私の C コードには、特定の変数の名前を作成するのに役立つ 2 つのマクロがあります。例として、次のことを考慮してください。

#define MACROA(name) A_##name
#define MACROB(name) B_##name

void *MACROB(MACROA(object));

という変数を宣言しようとしていますB_A_object。ただし、これは機能せず、コンパイラから次のメッセージが表示されます。

object.c:27:21: error: a parameter list without types is only allowed in a function definition
void *MACROB(MACROA(object));
                    ^
object.c:26:26: note: expanded from macro 'MACROB'
#define MACROB(name) B_##name
                         ^

ということで、プリプロセッサは の結果を取っていないように見えますがMACROA(object)、式自体を考慮して を作ろうとしていB_MACROA(object)ます。では、別のマクロに渡されたマクロの結果をプリプロセッサに考慮させるにはどうすればよいでしょうか?

4

1 に答える 1

4

連結演算子の動作がおかしい。最初に連結し、後で評価します。

void *MACROB(MACROA(object));  // The original line
void *B_MACROA(object);       // Becomes this, nothing more to expand

次の方法で解決できます。

#define CONC(a,b) a ## b
#define MACROA(name) CONC(A_, name)
#define MACROB(name) CONC(B_, name)
于 2013-07-11T14:58:34.137 に答える