我阅读了以下代码:
#define MACRO(abc, def) {#def ## #abc}
char result[10] = MARCO(abc, def);
我知道##
运算符用于将两个字符串合并为一个,但#
和def
前面的abc
呢?
答案 0 :(得分:1)
从标准(强调我的):
16.3.2#运算符[cpp.stringize]
2 /字符串文字是一个没有前缀的字符串文字。 如果在替换列表中,参数前面紧跟#预处理标记,则它们都被单个字符串文字预处理标记替换,该标记包含相应参数的预处理标记序列的拼写。的 [...] 强>
它会在#
之后“对字符串进行”字符串化。
示例:
#define STRINGIFY(x) #x
STRINGIFY(foo) // will be replaced by "foo"
答案 1 :(得分:0)
<强> Stringizing Operator (#) 强>
数字符号或“字符串化”运算符(#)将宏参数转换为字符串文字而不扩展参数定义。它仅用于带参数的宏。如果它位于宏定义中的形式参数之前,则宏调用传递的实际参数将用引号括起来并视为字符串文字。
所以,
char result[10] = MACRO(abc, def);
将扩展为:
char result[10] = "def" ## "abc";
将扩展为:
char result[10] = "defabc";
对于那些说不会工作/不会编译的人:我在MS VS2010中测试并运行了