【问题标题】:What does following c Macro declaration mean? [duplicate]以下 c 宏声明是什么意思? [复制]
【发布时间】:2015-04-27 15:41:05
【问题描述】:

如下c代码:

#define __xstr(s) __str(s)
#define __str(s) #s

#s 是什么意思?

【问题讨论】:

  • 除非它是实现的一部分,否则它具有未定义的行为。以两个下划线开头的标识符,或以一个下划线后跟一个大写字母开头的标识符是保留的。

标签: c macros


【解决方案1】:

Stringification operator:

# 运算符(称为“字符串化运算符”)将标记转换为字符串,适当地转义任何引号或反斜杠。

例子:

#define str(s) #s

str(p = "foo\n";) // outputs "p = \"foo\\n\";"
str(\n)           // outputs "\n"

如果要对宏参数的展开进行字符串化,则必须使用两级宏:

#define xstr(s) str(s)
#define str(s) #s
#define foo 4

str (foo)  // outputs "foo"
xstr (foo) // outputs "4"

最后一个示例中的代码与问题中的代码非常接近。请注意,正如 @KeithThompson 所述,“以下划线开头的标识符,或下划线后跟大写字母的标识符是保留的”。

【讨论】:

    【解决方案2】:

    宏允许做字符串化,即将宏参数转换成字符串:

    __xstr(foo) 产生"foo"

    __xstr(4) 产生"4"

    #define BLA bar

    __xstr(BLA) 产生"bar"

    您需要两个级别的宏来实现这一点,请参阅此处了解更多信息:

    https://gcc.gnu.org/onlinedocs/cpp/Stringification.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 2017-12-21
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多