我阅读标准文档草案表明,在预处理程序表达式中使用一元*或一个常量下标取消引用字符串文字应该是合法的。例如,我应该可以说(使用预定义的__ 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错误报告之前,有没有人有任何反驳?答案 0 :(得分:0)
您的技术在代码中工作,如if(* _ _ DATE _ _ ==' A')语句,但不在#IF宏中。预处理器不会进行那种表达式评估。