использование значений перечисления в директиве препроцессора - PullRequest
0 голосов
/ 30 августа 2018

У меня есть следующий код:

#include <stdio.h>

enum {A, B};

#define C A

int main() {
#if C == B
  printf("%d==%d\n", C, B);
#else
  printf("%d!=%d\n", C, B);
#endif
}

, что, на удивление, дает вывод:

0==1

Теперь я понимаю, что код неправильный, потому что значения перечисления неизвестны препроцессору. Что я не понимаю, так это почему не генерируется ошибка ... A и B должны быть неопределенными во время предварительной обработки, как этот препроцессор не выдает ошибку?

1 Ответ

0 голосов
/ 30 августа 2018

Препроцессор работает в отдельной фазе, прежде чем компилятор правильно обработает источник. Как таковой он ничего не знает о символах в реальном исходном коде (например, перечисления или переменные).

Для препроцессора символ B является неизвестным макросом, и при использовании в этом контексте (#if C == B) он будет равен нулю. Поскольку символ A является и также не макросом, он также будет иметь нулевое значение. Вся эта аренда для сравнения #if 0 == 0, что действительно верно.

Смотри, например, эта фаза ссылки на перевод для получения дополнительной информации о фазах перевода и эта условная ссылка препроцессора для получения дополнительной информации об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...