5

私はこのようなマクロを持っています(正確ではありませんが、関数はまったく同等です):

#define STRUCTMEMBER(Member,Value) GlobalStructInstance. ## Member = Value
...
STRUCTMEMBER(Item,1);

これはVisualC++では完全に機能しますが、gcc 3.4.5(MingGW)では次のエラーが発生します。

「。」を貼り付けます 「アイテム」は有効な前処理トークンを提供しません

これは、「->」演算子を使用した場合にも発生します。これらの演算子の使用が禁止されているという連結のヒントは見つかりませんでした。

誰かアイデアがありますか?

4

3 に答える 3

7

おそらく、Visual C++ はいくつかのスペースを貼り付けて別のスペースを作成しています。空白はトークンではありませんが、コードを機能させることができます。

object.memberはトークンではなく、3 つのトークンであるため、記述したマクロを実装するためにトークンを貼り付ける必要はありません。「##」を削除するだけで、どこでも機能するはずです。

[編集: チェックしたところ、## を使用して有効なトークンではないものを形成した結果は未定義です。したがって、私が知る限り、GCCはそれを拒否することができ、MSVCはそれを無視して貼り付けを実行しないことが許可されています.]

于 2009-07-30T13:41:18.073 に答える
4

gcc cプリプロセッサのドキュメントから:

ただし、一緒に有効なトークンを形成しない 2 つのトークンを一緒に貼り付けることはできません。

structure.member は単一のトークンではありません。

この場合、## (トークン連結) 演算子を使用する必要はありません。あなたはそれを取り除くことができます。Linux で gcc 4.2.4 を使用してテストした例を次に示します。

#include <stdio.h>

#define STRUCTMEMBER(Member, Value) GlobalStructInstance.Member = Value

struct {
    const char* member1;
}GlobalStructInstance;

int main(void)
{

    STRUCTMEMBER(member1, "Hello!");

    printf("GlobalStructInstance.member1 = %s\n",
           GlobalStructInstance.member1);

    return 0;
}
于 2009-07-30T13:59:22.170 に答える