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

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

DDD
DDDオリジナル
2024-12-19 14:10:10774ブラウズ

How Does Macro Expansion Order Affect Stringification in C Preprocessing?

文字列化の魔法を明らかにする

プログラミングの分野では、文字列化は、マクロが彼らの主張。このプロセスがどのように展開するかを理解するための鍵は、マクロ展開が発生する細心の注意を払った順序です。

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

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

str(foo) が評価されると、次の結果が得られます。 stringify 操作 (#) がテキスト展開よりも優先されるため、#s を "foo" に展開します。ただし、追加のマクロ間接指定層を導入する場合、操作の順序が重要になります。

xstr(foo) の場合

マクロ xstr(s) を定義します。 as:

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

このマクロを xstr(foo) に適用すると、予期しない結果「4」が生成されます。この謎を解明する鍵は、マクロ展開の次の手順にあります。

  1. # または ## のプレフィックスが付いたトークンを前処理します。
  2. マクロ引数内のマクロを展開します。
  3. マクロ パラメータを対応する置換テキストに置き換えます。
  4. さらなるマクロの結果を再スキャンします。

xstr(foo) が処理されるとき: xstr(s) 内の

  1. # が識別されます。
  2. foo は 4 に置き換えられます。
  3. str(s) 内の #s が次のものと交換されます#4.
  4. str(4) が再スキャンされました。

#4 は文字列リテラルであるため、「4」に解決されます。したがって、文字列化操作はテキスト展開後に有効になるため、xstr(foo) は「foo」ではなく「4」と評価されます。

マクロ順序のレッスン

これ一見直感に反する結果は、マクロな秩序の重要性を強調しています。このようなあいまいさを避けるために、ヘルパー マクロを使用して stringify 操作を適用する前に 1 つのステップを実行することが推奨されることがよくあります。これにより、操作の順序が明確に定義され、望ましい結果が保証されます。

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

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