47

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

私が言ったように、-Egccのスイッチを使用することで有効な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()?」と言う前に、それは私の実際のコードではありません。)

4

1 に答える 1

57

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

これは機能します:

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

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

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

于 2012-11-04T05:59:48.450 に答える