次のコードを読みました。
#define MACRO(abc, def) {#def ## #abc}
char result[10] = MARCO(abc, def);
##
演算子が 2 つの文字列を 1 つにマージするために使用されることは知っていますが、 and#
の前はどうですか?def
abc
次のコードを読みました。
#define MACRO(abc, def) {#def ## #abc}
char result[10] = MARCO(abc, def);
##
演算子が 2 つの文字列を 1 つにマージするために使用されることは知っていますが、 and#
の前はどうですか?def
abc
標準から(強調鉱山):
16.3.2 # 演算子 [cpp.stringize]
2/ 文字列リテラルは、プレフィックスのない文字列リテラルです。置換リストで、パラメーターの直前に # 前処理トークンがある場合、両方が、対応する引数の前処理トークン シーケンスのスペルを含む単一の文字列リテラル前処理トークンに置き換えられます。[...]
に続くトークンを「文字列化」します#
。
例:
#define STRINGIFY(x) #x
STRINGIFY(foo) // will be replaced by "foo"
番号記号または「文字列化」演算子 (#) は、パラメーター定義を展開せずに、マクロ パラメーターを文字列リテラルに変換します。引数を取るマクロでのみ使用されます。マクロ定義で仮パラメータの前にある場合、マクロ呼び出しによって渡される実引数は引用符で囲まれ、文字列リテラルとして扱われます。
そう、
char result[10] = MACRO(abc, def);
次のように展開されます。
char result[10] = "def" ## "abc";
これは次のように展開されます:
char result[10] = "defabc";
動作しない/コンパイルできないと言う人のために: 私はこれを MS VS2010 でテストして実行しました