我阅读了以下代码:
#define MACRO(abc, def) {#def ## #abc}
char result[10] = MARCO(abc, def);
我知道##
运算符用于将两个字符串合并为一个,但是and#
前面的呢?def
abc
我阅读了以下代码:
#define MACRO(abc, def) {#def ## #abc}
char result[10] = MARCO(abc, def);
我知道##
运算符用于将两个字符串合并为一个,但是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 中测试并运行了它