我正在尝试进行以下评估: 在我的头文件中(定义值可以更改):
#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编译器。
答案 0 :(得分:1)
您无法在#if
表达式 1 中使用强制转换。预处理器对类型一无所知。 (并且#if
支持的唯一值是简单整数,所以指针就在右边。)
只需使用常规if
声明:
if (X != 0) {
value = 1;
}
编译器将在编译时识别出条件始终为true(或为false)。
1 参考:ISO 9899:1999, 6.10.1条件包含:
- 控制条件包含的表达式应为整数常量表达式,除了:它不应包含强制转换; [...]
醇>