Из документации 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;