ホームページ >バックエンド開発 >C++ >C 風のマクロ展開で `str(foo)` が 'foo' を出力するのに、`xstr(foo)` が '4' を出力するのはなぜですか?

C 風のマクロ展開で `str(foo)` が 'foo' を出力するのに、`xstr(foo)` が '4' を出力するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-28 14:30:11230ブラウズ

Why Does `xstr(foo)` Output

文字列化を理解する: マクロ拡張の重要な手順

C 系言語の文字列化の概念を使用すると、式を文字列に変換できます。このプロセスに含まれる手順を理解することは、マクロを効果的に使用するために非常に重要です。

問題: 出力の違い

次のマクロ定義を考えてみましょう:

#define foo 4
#define str(s) #s

コードで str(foo) を使用すると、文字列化 (ステップ 1) がテキストの前に実行されるため、「foo」が出力されます。展開 (ステップ 2)。

ただし、追加のマクロを定義すると:

#define xstr(s) str(s)

そして xstr(foo) を使用すると、驚くべきことに出力は "4" になります。この違いには、文字列化プロセスを調べる必要があります。

マクロ展開の手順

マクロ展開のプロセスには、C および C 標準に従って、いくつかの手順が含まれます。

  1. 前処理: トークンの前に # または## が処理されます。
  2. 引数置換: マクロが各引数に適用されます。
  3. パラメータ置換: パラメータは、対応するマクロの結果に置き換えられます。 .
  4. 再スキャン中: コードは次のとおりですさらにマクロを展開するために再スキャンされました。

xstr(foo) への手順の適用

  1. 前処理: 該当するトークンはありません。
  2. 引数置換: foo は 4 に置き換えられます。
  3. パラメータ置換: str(s) で、s は 4 に置き換えられ、str(4) が生成されます。
  4. 再スキャン: str(4) が再スキャンされ、出力は次のようになります。 "4".

str(foo) が "foo" を出力する理由

xstr(foo) とは対照的に、str(foo) は "foo" を出力します理由:

  • 前処理: いいえ文字列化トークンが存在します。
  • 引数の置換: 該当なし。
  • パラメータの置換: foo が 4 に置換されていないため、#foo は変更されません。 .
  • 再スキャン中: #foo は再スキャンされず、「foo」が生成されます。

したがって、xstr のようなヘルパー マクロを使用すると、文字列化 (ステップ 1) の前にテキスト展開 (ステップ 2) が確実に実行され、正しい文字列化が可能になります。文字列変換。

以上がC 風のマクロ展開で `str(foo)` が 'foo' を出力するのに、`xstr(foo)` が '4' を出力するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。