取消引用预处理程序表达式

时间:2016-02-17 07:28:32

标签: c++ c++11 c-preprocessor c++14

我阅读标准文档草案表明,在预处理程序表达式中使用一元*或一个常量下标取消引用字符串文字应该是合法的。例如,我应该可以说(使用预定义的__ DATE __宏扩展为带引号的字符串):

#if *__DATE__ == 'A'

#if __DATE__[0] == 'A'

如果我在GCC中执行此操作,使用-std = gnu ++ 0x,前者会抱怨

error: operator '*' has no left operand

后者抱怨

error: token ""Feb 16 2016"" is not valid in preprocessor expressions

标准似乎并没有在编译器和预处理器之间以任何不同的方式定义 constant-expression 。编译器愉快地编译类似的东西:

int foo[*__DATE__];

int foo[__DATE__[0]];

在全球范围内,证明这些是合法的常量表达式。

我打电话给犯规。在我看来,标准需要预处理器来处理#if或#elif子句中的这些类型的表达式。在我把它作为GCC错误报告之前,有没有人有任何反驳?

1 个答案:

答案 0 :(得分:0)

您的技术在代码中工作,如if(* _ _ DATE _ _ ==' A')语句,但不在#IF宏中。预处理器不会进行那种表达式评估。