как макрос работает по-разному с целыми числами и символом в моем C-коде - PullRequest
1 голос
/ 07 июня 2019

Я знаком с условной компиляцией с макросами на языке "C", но какой-то фрагмент кода меня смущает, я могу понять, как работает CODE-1, в X ничего не назначено, поэтому Y определен как 5 (условие другое ) и при печати Y мы получим 5 в качестве вывода.

, но в CODE-2, который очень похож на CODE-1, за исключением "#if X == A" условие, которое дает вывод как 3, что я не понимаю, как оно может производить вывод как 3. Может кто-нибудь сказать мне, как

 "#if X == 3"

и

"#if X == A"`

влияет на вывод.


КОД-1

#include <stdio.h>
#if X == 3
#define Y 3
#else
#define Y 5
#endif

int main()
{
  printf("%d", Y);
  return 0;
}

//output : 5

КОД-2

#include <stdio.h>
#if X == A
#define Y 3
#else
#define Y 5
#endif

int main()
{
  printf("%d", Y);
  return 0;
}

//output : 3

Я ожидаю, что выход CODE-2 будет 5, но фактический вывод 3.

1 Ответ

3 голосов
/ 07 июня 2019

Жетоны в условных макросах, которые не расширяются до целых чисел (не являются макросами), заменяются на 0.

6.10.1p4 :

Перед оценкой, вызовы макросов в списке токенов предварительной обработки, которые станут выражением управляющей константы, заменяются (за исключением тех имен макросов, измененных определенным унарным оператором), как в обычном тексте.Если определенный токен генерируется в результате этого процесса замены или использование определенного унарного оператора не соответствует одной из двух указанных форм до замены макроса, поведение не определено.После выполнения всех замен в связи с расширением макроса и определенным унарным оператором все оставшиеся идентификаторы (включая те, которые лексически идентичны ключевым словам) заменяются на номер pp 0 , а затем каждый токен предварительной обработки преобразуется взнакПолученные токены составляют выражение управляющей константы, которое оценивается по правилам 6.6.

Поскольку ни X, ни то, почему Y не определено в вашем втором фрагменте, оно становится эквивалентным:

#if 0 == 0
#define Y 3
#else
#define Y 5
#endif

, который естественно разрешается в первую ветвь.

...