-3

我正在尝试进行以下评估:在我的头文件中(定义值可以更改):

#define X ((void *) 0)

在我的功能中:

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

当我进行操作以查看 DEFINE 是否存在(或不存在)时,它工作正常(#ifdef 或 #if defined(X))。但我想要的是能够在编译时评估 X 的值。我是否缺少任何标志或我需要设置的东西才能使这项工作?我正在使用 Green Hills 编译器。

4

1 回答 1

1

您不能在#if表达式1中使用强制转换。预处理器对类型一无所知。(并且唯一支持的值#if是简单的整数,所以指针是正确的。)

只需使用常规if语句:

if (X != 0) {
    value = 1;
}

编译器将在编译时识别条件始终为真(或假,取决于)。


1参考:ISO 9899:1999, 6.10.1 有条件包含

  1. 控制条件包含的表达式应为整数常量表达式,但以下情况除外: 它不应包含强制转换;[...]
于 2018-01-19T21:25:18.247 回答