Stringizing 演算子 (|)
シャープ記号 stringizing 」または 「演算子 (#) はリテラル文字列をパラメーター定義を配置せずにマクロ パラメーターを変換します。これは引数を受け取るマクロでのみ使用されます。これがマクロ定義の仮パラメーターを指定するとマクロの呼び出しを実際に渡された引数は引用符で囲み文字列リテラルとして扱われます。リテラル文字列はマクロ定義内の stringizing 演算子と仮パラメーターの組み合わせの各を置き換えます。
[!メモ]
前にマクロの仮引数の表示中のリテラル文字列と文字定数を配置した 15 ANSI C 規格に Microsoft C (Version 6.0 以前) の拡張子はサポートされていません。これを頼りましたこの拡張子 (#) stringizing 演算子を使用して書き直す必要があります。コード。
実引数と実引数の最後のトークンの後の最初のトークンに先行する空白は無視されます。実引数のトークンの間にある空白は結果の文字列リテラルの単一の空白になります。したがってコメントの実引数の 2 種類のトークンどうしの間に発生し単一の空白になります。結果文字列のリテラル空白のみで区切られた隣接するリテラル文字列と自動的に連結されます。
リテラル文字列では引数に含まれる文字は通常エスケープ シーケンスが必要な場合は(たとえば 「 引用符 () またはバックス ラッシュ (\) 文字)必要なエスケープのバックス ラッシュは文字の前に自動的に挿入されます。
Visual C++ の stringizing 演算子は全ての状況で期待どおりに動作しないことがあります。; 詳細については16.3.2 | 演算子 を参照してください。
使用例
次の例では stringizing 演算子と main 関数を呼び出すマクロを含むマクロ定義を示しています :
このような呼び出しはプリプロセス時に配置され次のコードを生成します :
int main() {
printf_s( "In quotes in the printf function call\n" "\n" );
printf_s( "\"In quotes when printed to the screen\"\n" "\n" );
printf_s( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
// stringizer.cpp
#include <stdio.h>
#define stringer( x ) printf_s( #x "\n" )
int main() {
stringer( In quotes in the printf function call );
stringer( "In quotes when printed to the screen" );
stringer( "This: \" prints an escaped double quote" );
}
次の例ではマクロ パラメーターを配置する方法を示しています :
// stringizer_2.cpp
// compile with: /E
#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)
FB(F B)
FB1(F B)