Xマクロを実装していますが、単純なマクロ展開に問題があります。このマクロ(以下を参照)は、this
記事に含めることにより、いくつかのマクロの使用例で使用されます。-E
コンパイラはエラーメッセージを表示しますが、GCCコンパイラでフラグを使用することで有効なCコードを確認できます。
マクロXリストは次のように定義されます。
#define LIST \
X(red, "red") \
X(blue, "blue") \
X(yellow, "yellow")
その後:
#define X(a, b) foo.##a = -1;
LIST;
#undef X
しかし、gccは次のエラーメッセージを表示しました。
lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token
私が言ったように、-E
gccのスイッチを使用することで有効なCコードを見ることができます:
lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token
foo.red = -1; foo.blue = -1; foo.yellow = -1;;
有効な前処理トークンとは何ですか?誰かがこれを説明できますか?
(「なぜ初期化またはmemset()
?」と言う前に、それは私の実際のコードではありません。)