C 是否可以使用GreenHills使用与数值常量不同的东西进行预处理求值?
我正在尝试进行以下评估: 在我的头文件中(定义值可以更改): 在我的职责中:C 是否可以使用GreenHills使用与数值常量不同的东西进行预处理求值?,c,c-preprocessor,greenhills,C,C Preprocessor,Greenhills,我正在尝试进行以下评估: 在我的头文件中(定义值可以更改): 在我的职责中: uint8_t foo() { uint8_t value = 0; #if ( X != 0 ) value = 1; #endif return value; } 当我编译代码时,它会抛出以下错误: #57: this operator is not allowed in a constant expression #58: this operator is not allowed in
uint8_t foo() {
uint8_t value = 0;
#if ( X != 0 )
value = 1;
#endif
return value;
}
当我编译代码时,它会抛出以下错误:
#57: this operator is not allowed in a constant expression
#58: this operator is not allowed in a preprocessing expression
当我执行操作以查看定义是否存在(或不存在)时,它工作正常(#ifdef或#if defined(X))。但是我想要的是能够在编译时计算X的值。
我是否缺少任何标志或我需要设置的东西,以便能够使这项工作?我正在使用Green Hills编译器。如果表达式为1,则不能在
#中使用强制转换。预处理器对类型一无所知。(如果#if
只支持简单的整数,那么指针就是右键。)
只需使用常规的if
语句:
if (X != 0) {
value = 1;
}
编译器将在编译时识别条件始终为true(或false,具体取决于)
1参考文献:ISO 9899:1999,6.10.1条件包含:
控制条件包含的表达式应为整数常量表达式,但以下情况除外:不应包含强制转换;[……]
请发布显示问题的。标准C可以与任何C编译器一起工作。X==0
可以工作吗?如果是这样,那么只需添加#else
子句……请说明做某事
的含义。预处理器语句没有任何直接操作。最后显示实际代码,该代码无效,因为X
不是数值常量。问题的前一个版本,即您有#define X 0
,是有效的,应该有效。显示实际代码有那么困难吗?你只是白白浪费了几个人的时间。事实上,你可以在#if
表达式中使用强制转换,但不是OP试图使用的特定表达式。你可以在预处理器表达式中使用任何强制转换,只要你明白它是在编译过程中在预处理器步骤后的上下文中编译的。@JohnBollinger My C99则相反(在6.10.1/1中)。@nicomp你所说的“预处理器表达式”是什么意思?@melpomene,当前的C标准是C2011。我在自己的回答中引用了它的相关规定(编号恰好相同);它不包含禁止强制转换的内容。
if (X != 0) {
value = 1;
}