c++的C预处理器宏中的#和##是什么意思[重复]

问题描述 投票:0回答:2

我阅读了以下代码:

#define MACRO(abc, def) {#def ## #abc}    
char result[10] = MACRO(abc, def);

我知道

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

c macros c-preprocessor stringification
2个回答
2
投票

来自标准(强调我的):

16.3.2 # 运算符 [cpp.stringize]

2/ 字符串文字是没有前缀的字符串文字。 如果在替换列表中,参数前面紧跟着 # 预处理标记,则两者都将替换为单个字符串文字 预处理标记,其中包含相应参数的预处理标记序列的拼写。 [...]

它将

#
之后的标记“字符串化”。

示例:

#define STRINGIFY(x) #x

STRINGIFY(foo)  // will be replaced by "foo"

1
投票

字符串化运算符 (#)

数字符号或“字符串化”运算符 (#) 将宏参数转换为字符串文字,而不扩展参数定义。它仅与带有参数的宏一起使用。如果它位于宏定义中的形式参数之前,则宏调用传递的实际参数将括在引号中并被视为字符串文字。

那么,

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

将扩展为:

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

这将扩展到:

char result[10] = "defabc";

对于那些说它不起作用/无法编译的人:我在 MS VS2010 中测试并运行了它

© www.soinside.com 2019 - 2024. All rights reserved.