2

次のコードを読みました。

#define MACRO(abc, def) {#def ## #abc}

char result[10] = MARCO(abc, def);

##演算子が 2 つの文字列を 1 つにマージするために使用されることは知っていますが、 and#の前はどうですか?defabc

4

2 に答える 2

1

標準から(強調鉱山):

16.3.2 # 演算子 [cpp.stringize]

2/ 文字列リテラルは、プレフィックスのない文字列リテラルです。置換リストで、パラメーターの直前に # 前処理トークンがある場合、両方が、対応する引数の前処理トークン シーケンスのスペルを含む単一の文字列リテラル前処理トークンに置き換えられます。[...]

に続くトークンを「文字列化」します#

例:

#define STRINGIFY(x) #x

STRINGIFY(foo)  // will be replaced by "foo"
于 2013-09-18T14:43:29.317 に答える
0

文字列化演算子 (#)

番号記号または「文字列化」演算子 (#) は、パラメーター定義を展開せずに、マクロ パラメーターを文字列リテラルに変換します。引数を取るマクロでのみ使用されます。マクロ定義で仮パラメータの前にある場合、マクロ呼び出しによって渡される実引数は引用符で囲まれ、文字列リテラルとして扱われます。

そう、

char result[10] = MACRO(abc, def);

次のように展開されます。

char result[10] = "def" ## "abc";

これは次のように展開されます:

char result[10] = "defabc";

動作しない/コンパイルできないと言う人のために: 私はこれを MS VS2010 でテストして実行しました

于 2013-09-18T14:41:43.437 に答える