Можно ли выполнить оценку предварительной обработки с чем-то отличным от числовой константы с использованием 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 или #iffined(X)). Но я хочу иметь возможность оценить значение X во время компиляции. Я пропускаю какой-либо флаг или что-то, что мне нужно установить, чтобы сделать эту работу? Я использую компилятор Green Hills.

1 ответ

Вы не можете использовать броски в #if выражения1. Препроцессор ничего не знает о типах. (И единственные значения, поддерживаемые #if простые целые числа, поэтому указатели прямо.)

Просто используйте обычный if заявление:

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

Компилятор распознает, что условие всегда истинно (или ложно, в зависимости) во время компиляции.


1 Ссылка: ISO 9899: 1999, 6.10.1 Условное включение:

  1. Выражение, управляющее условным включением, должно быть выражением целочисленной константы, за исключением того, что: оно не должно содержать приведение; [...]
Другие вопросы по тегам