【问题标题】:C/C++ Preprocessor - 'Charify'C/C++ 预处理器 - 'Charify'
【发布时间】:2014-02-26 07:51:07
【问题描述】:

有没有办法使用 C/C++ 预处理器“刻画”某些东西?您可以通过以下方式“字符串化”:

#define STRINGIFY(x) #x

那么,有没有一种方法可以使用相同的原理来“刻画”?

【问题讨论】:

  • (#x [0])? (长度)
  • 至少 GCC 和可能的 Clang 将 ("string literal"[0]) 视为常量表达式。
  • @user3175411 但不幸的是 C 并不将其视为常量表达式
  • @ouah,你确定吗?对我来说,它看起来很稳定。请问标准的章节和诗句?
  • @vonbrand 尝试使用 gcc 或 clang 编译 static int x = "a"[0];,您会看到非常量初始化程序出现错误。对于 c99 中 6.6p6 和 6.6p7 的标准外观,您会看到“a”[0] 不在允许的常量表达式列表中。

标签: c macros c-preprocessor stringification


【解决方案1】:

类似:

#define CHARa() 'a'
#define CHARb() 'b'
#define CHARc() 'c'
// ...
#define CHARIFY(x) CHAR ## x()

CHARIFY(a)

【讨论】:

  • 如果你觉得这很丑,想想你需要什么样的运营商。 CHARIFY(%) 必须扩展为 PREFIX % SUFFIX 之类的东西,没有标记连接(因为 % 不能成为标记的一部分)。然而标记序列PREFIX a SUFFIX(同样没有连接)也必须是有效的并且是一个常量表达式。
猜你喜欢
  • 2010-09-07
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2020-02-09
  • 2019-07-08
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多