ホームページ >バックエンド開発 >C++ >マクロの展開順序は C および C の文字列化にどのような影響を与えますか?

マクロの展開順序は C および C の文字列化にどのような影響を与えますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-25 17:24:10451ブラウズ

How Does Macro Expansion Order Affect Stringification in C and C  ?

文字列化: マクロ展開プロセスを理解する

C および C の領域では、「文字列化」という用語は、マクロ引数の文字列リテラルへの変換を指します。 。ただし、次のシナリオで示されているように、プロセスは複雑になる可能性があります。

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

この場合、文字列化プロセス (# 演算子) がマクロの前に実行されるため、str(foo) は「foo」を出力します。展開 (#define ディレクティブ)。これにより、foo がマクロ名のままになり、その値で置換されなくなります。

ただし、次のコード スニペットは異なる結果を生成します。

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

xstr(foo) が呼び出されると、出力は「4」となります。この動作を理解するには、マクロ展開の複雑さを詳しく調べる必要があります。

C および C 標準によれば、マクロ展開プロセスには次の手順が必要です:

  1. 識別および処理# または ## (文字列化演算子) が前に付くトークン。
  2. 対応するマクロに置き換えます。マクロ引数の定義。
  3. 各関数パラメータをマクロ置換の結果で置き換えます。
  4. 追加のマクロのコードを再スキャンします。

の場合xstr(foo):

  1. xstr マクロは文字列化を必要としません (ステップ1).
  2. foo はその値 4 に置き換えられます (ステップ 2)。
  3. str マクロ内で、s は 4 に置き換えられ、str(4) になります (ステップ 3)。
  4. str(4) が再スキャンされ、「4」が得られます (最終

ここでの主な違いは、マクロ引数が置換されるステップ (ステップ 2) にあります。最初の例の str(foo) では、ステップ 1 で文字列化が適用された後にステップ 2 が発生します。したがって、foo は置換されず、出力は "foo" のままです。

この問題に対処するには、ヘルパー マクロ xstr が使用されます。マクロをネストすることで、最初にステップ 2 で引数の置換を実行し、次にステップ 1 で文字列化を適用して、目的の結果「4」が確実に得られるようにすることができます。

以上がマクロの展開順序は C および C の文字列化にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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