C/C++预处理器 - 'Charify'

4
有没有一种使用C/C++预处理器“字符化”某些内容的方法?您可以通过以下方式进行“字符串化”:
#define STRINGIFY(x) #x

那么,是否有一种使用相同原理的“字符化”方法呢?

7
(#x [0])是指x列表的第一个元素,(length)表示计算列表的长度。 - user3175411
至少GCC,可能还有Clang将("string literal"[0])视为常量表达式。 - user3175411
2
@user3175411,但不幸的是,C语言不将其视为常量表达式。 - ouah
@ouah,你确定吗?在我看来它看起来相当固定。请给出标准的章节和节号? - vonbrand
@vonbrand 尝试使用gcc或clang编译static int x = "a"[0];,你会发现你得到了一个非常量初始化器的错误。对于标准,请查看c99的6.6p6和6.6p7,你会发现"a"[0]不在允许的常量表达式列表中。 - ouah
1个回答

2

Something like:

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

CHARIFY(a)

如果你认为这很丑陋,那么请考虑一下运算符所需的内容。CHARIFY(%)必须扩展为类似于PREFIX%SUFFIX的内容,而不是令牌串联(因为%不能成为令牌的一部分)。然而,令牌序列PREFIX a SUFFIX(同样不需要串联)也必须是有效的常量表达式。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接