【问题标题】:What does the # and ## means in C preprocessor macro of c++ [duplicate]#和##在c ++的C预处理器宏中是什么意思[重复]
【发布时间】:2013-09-18 14:38:05
【问题描述】:

我阅读了以下代码:

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

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

我知道##操作符是用来将两个字符串合并为一个的,但是defabc前面的#呢?

【问题讨论】:

  • 这记录在预处理器的手册中。查一下。
  • 大概“MARCO”会报编译错误。
  • Stack Overflow 不能替代阅读文档。你问这个问题的事实让人觉得你很懒。
  • 并且将两个字符串文字连接成一个标记也会产生错误。
  • 我不同意上述观点 - 在 Stack Overflow 上找到答案比查找和挖掘文档要容易得多。我永远不记得哪个是哪个,哪个是 Google 的用途 - 快速的 Google 搜索让我直接进入这个 Stack Overflow 条目并回答我的问题。

标签: c macros c-preprocessor stringification


【解决方案1】:

来自标准(强调我的):

16.3.2 # 运算符 [cpp.stringize]

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

它“字符串化”# 之后的令牌。

例子:

#define STRINGIFY(x) #x

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

【讨论】:

    【解决方案2】:

    Stringizing Operator (#)

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

    所以,

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

    将扩展为:

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

    这将扩展为:

    char result[10] = "defabc";
    

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

    【讨论】:

    • 它不会在任何符合标准的编译器上编译:ideone.com/noE2cd"def""abc" 不是一个有效的标记,即使你的编译器碰巧按预期解释它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 2017-03-18
    • 2014-03-23
    • 2017-10-16
    • 2014-01-17
    • 2012-12-30
    相关资源
    最近更新 更多