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;
    }