web-dev-qa-db-ja.com

エラー:「。」を貼り付けます「赤」は有効な前処理トークンを与えません

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()だけではない理由」と言う前に、それは私の本当のコードではありません。)

34
Jack

.はトークンを分離するため、##は有効なトークンではないため、.redは使用できません。 2つのトークンを単一のトークンに連結する場合にのみ、##を使用します。

これは動作します:

#define X(a, b) foo.a = -1;

有効なプロプロセッシングトークンとは何ですか?誰かがこれを説明できますか?

解析/字句解析されるものです。 foo.barは、3つのトークン(2つの識別子と演算子)として解析されます:foo . bar##を使用すると、2つのトークン(1つの識別子と1つの無効なトークン)のみが得られます:foo .bar

44
Pubby