#和##在c ++的C预处理器宏中意味着什么

时间:2013-09-18 14:38:05

标签: c macros c-preprocessor stringification

我阅读了以下代码:

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

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

我知道##运算符用于将两个字符串合并为一个,但#def前面的abc呢?

2 个答案:

答案 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中测试并运行了