1. ホーム
  2. c

[解決済み] C言語の##と__LINE__を使ったマクロの作成 (位置決めマクロによるトークン連結)

2022-05-17 20:43:46

質問

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

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

のような展開になればいいなと思ったのですが。

static void Unique_23(void) {}

これではうまくいきません。トークンコンカチネーションでは、位置決めマクロ は文字通りに扱われ、最終的に以下のように展開されます。

static void Unique___LINE__(void) {}

これは可能なのでしょうか?

どのように解決するのですか?

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

#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言語ではありません。