使用GreenHills是否可以使用不同于数字常量的预处理评估?

时间:2018-01-19 20:47:04

标签: c c-preprocessor greenhills

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

#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编译器。

1 个答案:

答案 0 :(得分:1)

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

只需使用常规if声明:

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

编译器将在编译时识别出条件始终为true(或为false)。

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

  
      
  1. 控制条件包含的表达式应为整数常量表达式,除了:它不应包含强制转换; [...]
  2.