[解決済み] ダブルストリングスのトリックは、具体的にどのように機能するのですか?
質問
少なくともいくつかの C プリプロセッサでは、マクロを文字列化する別の関数にマクロを渡すことで、マクロの名前ではなく、値を文字列化することができます。
#define STR1(x) #x
#define STR2(x) STR1(x)
#define THE_ANSWER 42
#define THE_ANSWER_STR STR2(THE_ANSWER) /* "42" */
使用例 ここで .
これは、少なくともGCCとClangでは動作します(両方とも
-std=c99
で)、しかし、私は
はどのように
が C 標準の用語でどのように機能するかはわかりません。
この動作はC99で保証されているのでしょうか?
もしそうなら、C99はどのようにそれを保証するのでしょうか?
そうでない場合、どの時点で動作がC-definedからGCC-definedになるのでしょうか?
どのように解決するのですか?
はい、保証します。
マクロへの引数はそれ自体がマクロ展開されるため、動作します。 を除いて で、マクロ引数名がマクロ本体で文字列子 # またはトークンパスタ ## と共に表示される場合に機能します。
6.10.3.1/1:
... の引数の後に 関数型マクロの呼び出しの が識別された後、引数の置換が行われます。 の置換が行われます。引数 は、置換リスト中の の前に#または##前処理トークンがあるか トークンが先行するか、##前処理トークンが後続する場合を除き、置換リスト内のパラメータは 前処理トークン(下記参照)がない限り,置換リスト中のパラメータは 対応する引数で置き換えられます。 に置き換えられる。 が展開された後、対応する引数に置き換えられます。
ということは、もしあなたが
STR1(THE_ANSWER)
とすると、STR1の引数はマクロ展開されていないので、"THE_ANSWER"が得られます。しかし、STR2 の引数は
は
の引数はマクロ展開され、STR2 の定義に代入されるため、STR1 の引数は
42
となり、結果は "42"となります。
関連
-
[解決済み] C++とCの融合 - #ifdef __cplusplus はどのように機能するのか?
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] LD_PRELOADのトリックとは何ですか?
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
-
[解決済み] GCCの##__VA_ARGS__トリックの標準的な代替手段?
-
[解決済み】__attribute__((constructor))は具体的にどのように機能するのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Cエラー [エラー] 代入_Ashesの左オペランドにlvalueが必要です-プログラマーズ・シークレット
-
C++の配列コピー
-
C/C++の再定義
-
[解決済み] PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param )
-
[解決済み] stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?