Xマクロを実装していますが、単純なマクロ展開に問題があります。このマクロ(以下を参照)は、 this
の記事に含めることにより、いくつかのマクロの使用例で使用されます。コンパイラはエラーメッセージを表示しますが、GCCコンパイラで_-E
_フラグを使用すると、有効な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
_
先ほど言ったように、gccで_-E
_スイッチを使用すると、有効な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()
だけではない理由」と言う前に、それは私の本当のコードではありません。)
.
はトークンを分離するため、##
は有効なトークンではないため、.red
は使用できません。 2つのトークンを単一のトークンに連結する場合にのみ、##
を使用します。
これは動作します:
#define X(a, b) foo.a = -1;
有効なプロプロセッシングトークンとは何ですか?誰かがこれを説明できますか?
解析/字句解析されるものです。 foo.bar
は、3つのトークン(2つの識別子と演算子)として解析されます:foo . bar
##
を使用すると、2つのトークン(1つの識別子と1つの無効なトークン)のみが得られます:foo .bar