ホームページ > バックエンド開発 > C++ > C/C マクロの文字列化がネストされると予期しない結果が生じるのはなぜですか?

C/C マクロの文字列化がネストされると予期しない結果が生じるのはなぜですか?

DDD
リリース: 2024-12-17 11:03:25
オリジナル
645 人が閲覧しました

Why Does Stringification in C/C   Macros Produce Unexpected Results When Nested?

文字列化: プロセスを理解する

C や C などのプログラミング言語でマクロを扱うとき、文字列化の概念は興味深いものになることがあります。文字列化は、マクロの引数を文字列リテラルに変換します。この記事では、文字列化がどのように機能するのか、特に予期しない出力結果が生じる一般的なシナリオに焦点を当てて説明します。

たとえば、C では、文字列化は通常、次のように # 演算子を使用して行われます。

#define str(s) #s
ログイン後にコピー

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

#define foo 4
ログイン後にコピー

foo で str マクロを使用すると、「4」ではなく「foo」が出力されます。これは、C のマクロ展開プロセスには複数のステップが含まれるためです。

  1. プリプロセッサ処理: #define などのプリプロセッサ ディレクティブが最初に処理されます。
  2. 文字列化: str() のようなマクロが適用され、引数が次のように変換されます。 strings.
  3. トークン置換: foo のようなトークンは、定義された値に置き換えられます。

str(foo) の場合、文字列化はステップ 2 で発生します。 、fooを「foo」に変換します。ステップ 3 では、「foo」が定義された値 4 に置き換えられ、出力は「4」になります。

ただし、次のように str() が別のマクロへの引数として使用される場合は、

#define xstr(s) str(s)
ログイン後にコピー

予期しない動作が発生する可能性があります。 xstr(foo) を使用すると、「foo」の代わりに「4」が出力されます。

これが起こる理由を理解するには、xstr() の展開に含まれる手順を考慮する必要があります。

  1. 文字列化: # または ## トークンが存在しないため、アクションは実行されません。
  2. 引数の置換: foo は次のように置き換えられます。 4.
  3. パラメータ置換: str() の s が 4 に置き換えられ、str(4) が生成されます。
  4. 再スキャン: str(4) が再スキャンされます (出力「4」が生成されます)。

xstr(foo) では、ステップ 2 で引数 foo が 4 に置き換えられ、その後のみ、ステップ 1 が適用されて、文字列化された結果 str(4) が "4" に変換されます。

これは、マクロ展開プロセスとさまざまなステップが実行される順序を理解することの重要性を示しています。最初に特定のステップを実行するヘルパー マクロを使用することで、開発者は文字列化の結果を制御し、目的の動作を実現できます。

以上がC/C マクロの文字列化がネストされると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート