Можно ли выполнить оценку предварительной обработки с чем-то отличным от числовой константы с использованием 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 Условное включение:
- Выражение, управляющее условным включением, должно быть выражением целочисленной константы, за исключением того, что: оно не должно содержать приведение; [...]