[解決済み] 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言語ではありません。
関連
-
VSCodeでCプログラムを書くとエラーになる:ソースファイル "stdio.h" を開くことができない
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
未定義の `__isoc99_sscanf' への参照
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 新しい配列を作成せずに、既存のJavaScript配列を別の配列で拡張する方法
-
[解決済み] ストラクチャーとユニオンの違い
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
error: '.' トークンの前にunqualified-idを指定する必要があります。
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] Linuxカーネルにおけるcontainer_ofマクロの理解
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] ストラクチャーとユニオンの違い