Есть ли особый случай для макросов при раскрытии макроса в «/ *»?

Вот соответствующий пример. Очевидно, это неверно 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, не должен просто вставлять лишние пробелы во время расширения макроса только потому, что это, вероятно, предотвратит ошибки программирования.

13
задан Deduplicator 14 March 2016 в 20:01
поделиться