【问题标题】:Using '#' and '##' preprocessing operators together一起使用 '#' 和 '##' 预处理运算符
【发布时间】:2019-01-26 08:54:06
【问题描述】:

根据我的阅读,我了解到# 运算符与参数宏一起使用以将其参数转换为字符串,## 用于连接两个参数或带有其他标识符的参数(如果我的理解是错误的)。

但是我怎样才能同时使用### 运算符呢?我尝试过这样做:

#define str(n)  #n ## #n

我当时想

printf("%s",str(Hello))

将扩展为

printf("%s", "Hello""Hello")

由于相邻的字符串会自动连接以在 C 中形成一个字符串,因此这将导致 printf("%s", "HelloHello") 并且输出将是HelloHello。但故事不同,它抛出了一个错误:

粘贴“hello”和“hello”不会给出有效的预处理令牌

请解释一下这些带有### 运算符的参数宏是如何扩展的。

【问题讨论】:

  • 它“抛出”了什么错误?
  • 错误:粘贴“hello”和“hello”没有给出有效的预处理令牌

标签: c c-preprocessor preprocessor-directive


【解决方案1】:

##“连接两个参数”过于简单化了。此运算符加入 tokens。结果必须是单个 valid 令牌。两个字符串文字标记不能粘贴到单个标记中。

此外,字符串文字连接在稍后的翻译阶段处理。因此,对您的宏的一个明显修复是根本不使用##

#define str(n) #n #n

但如果你真的想同时使用两者,那么你需要在字符串化之前粘贴标记。并通过中间宏扩展来做到这一点。

#define str(n) str_(n ## n)
#define str_(nn) #nn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2021-06-28
    • 2018-06-09
    • 1970-01-01
    相关资源
    最近更新 更多