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 標準によれば、マクロ展開プロセスには次の手順が必要です:
の場合xstr(foo):
ここでの主な違いは、マクロ引数が置換されるステップ (ステップ 2) にあります。最初の例の str(foo) では、ステップ 1 で文字列化が適用された後にステップ 2 が発生します。したがって、foo は置換されず、出力は "foo" のままです。
この問題に対処するには、ヘルパー マクロ xstr が使用されます。マクロをネストすることで、最初にステップ 2 で引数の置換を実行し、次にステップ 1 で文字列化を適用して、目的の結果「4」が確実に得られるようにすることができます。
以上がマクロの展開順序は C および C の文字列化にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。