Препроцессор C добавляет завершающий «1» после раскрытия макроса, определенного в командной строке - PullRequest
0 голосов
/ 21 мая 2018
$ echo 'MACRO();' | gcc -D'MACRO() hello' -E -P -
hello 1;
      ^ why 1?!!!!

Знаете ли вы, почему после расширения макроса добавляется трейлинг "1"?

1 Ответ

0 голосов
/ 21 мая 2018

Из документации GCC препроцессора :

-D name

Предопределение имени в виде макроса с определением 1.

-D name = определение

Предопределите имя как макрос, с определением определения.Содержимое определения токенизируется и обрабатывается так, как если бы оно появилось на третьем этапе перевода в директиве #define.

Итак, вы хотите:

$ echo 'MACRO();' | gcc -D'MACRO()=hello' -E -P -
hello;

Обратите внимание на знак равенства в определении.

Что касается того, почему он делает то, что делает без него: пробелы являются разделителями в определении символов препроцессора.Таким образом, препроцессор присваивает «привет» символу.Затем он замечает, что в определении нет знака равенства, поэтому он также добавляет значение по умолчанию «1».Это не ошибка, это просто случай пробела "в" символе препроцессора.

$ echo 'MACRO();' | gcc -D'MACRO() hello=foo' -E -P -
hello foo;
...