Вот соответствующий пример. Это, очевидно, неверно C , но я просто имею дело с препроцессором, поэтому код на самом деле не должен компилироваться.
#define IDENTITY(x) x
#define PREPEND_ASTERISK(x) *x
#define PREPEND_SLASH(x) /x
IDENTITY(literal)
PREPEND_ASTERISK(literal)
PREPEND_SLASH(literal)
IDENTITY(*pointer)
PREPEND_ASTERISK(*pointer)
PREPEND_SLASH(*pointer)
Запуск препроцессора gcc на нем:
gcc -std=c99 -E macrotest.c
Это дает:
(...)
literal
*literal
/literal
*pointer
**pointer
/ *pointer
Обратите внимание на дополнительный пробел в последней строке.
Это похоже на функцию, предотвращающую расширение макросов до "/ *", что, я уверен, является благонамеренным. Но с первого взгляда я не смог найти ничего, относящегося к этому поведению в стандарте C99. Опять же, я неопытный на C . Может кто-то пролить свет на это? Где это указано? Я предполагаю, что компилятор, придерживающийся C99, не должен просто вставлять дополнительные пробелы во время раскрытия макроса только потому, что это, вероятно, предотвратит ошибки программирования.