116

行番号に基づいた名前の関数を作成する C マクロを作成したいと考えています。私は次のようなことができると思いました(実際の関数には中括弧内にステートメントがあります):

#define UNIQUE static void Unique_##__LINE__(void) {}

私が望んでいたのは、次のようなものに拡張されることです。

static void Unique_23(void) {}

それはうまくいきません。トークン連結では、位置決めマクロは文字どおりに扱われ、最終的に次のように展開されます。

static void Unique___LINE__(void) {}

これは可能ですか?

4

2 に答える 2

194

問題は、マクロ置換がある場合、プリプロセッサは、文字列化演算子#もトークン貼り付け演算子##も適用されていない場合にのみ、マクロを再帰的に展開することです。したがって、いくつかの追加の間接レイヤーを使用する必要があります。再帰的に展開された引数でトークン貼り付け演算子を使用できます。

#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define UNIQUE static void TOKENPASTE2(Unique_, __LINE__)(void) {}

次に、__LINE__の展開中に行番号に展開され(またはUNIQUEのいずれにも関与しないため)、 の展開中にトークンの貼り付けが行われます。###TOKENPASTE

同じ行にマクロ__COUNTER__の複数のインスタンス化が必要な場合に備えて、評価されるたびに新しい整数に展開されるマクロもあることに注意してください。UNIQUE注: __COUNTER__MS Visual Studio、GCC (V4.3 以降)、および Clang でサポートされていますが、標準の C ではありません。

于 2009-10-20T20:33:26.013 に答える