2

我阅读了以下代码:

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

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

我知道##运算符用于将两个字符串合并为一个,但是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 回答