Этот документ в разделе 2.6 «Вычисленные включения» имеет следующий параграф:
Если строка расширяется до потока токенов, начинающегося с токена <и включающего токен>, то токены между <и первым> объединяются, чтобы сформировать имя файла для включения. Любой пробел между токенами сводится к одному пробелу; тогда любой пробел после начального <сохраняется, но завершающий пробел до закрытия> игнорируется . CPP ищет файл в соответствии с правилами для угловых скобок.
Я знаю, что это определяется реализацией, но почему так должно быть в GCC? Я имею в виду конкретно выделенное предложение выше.
РЕДАКТИРОВАТЬ
Я только что заметил, что третий абзац перед приведенным выше говорит следующее:
Вы должны быть осторожны при определении макроса.
#define
сохраняет токены, а не текст. Препроцессор не может знать, что макрос будет использоваться в качестве аргумента#include
, поэтому он генерирует обычные токены, а не имя заголовка. Это вряд ли вызовет проблемы, если вы используете двойные кавычки, которые достаточно близки к строковым константам. Однако если вы используете угловые скобки, у вас могут возникнуть проблемы .
Кто-нибудь знает, на какую проблему указывают здесь?
источник
Ответы:
Я предполагаю, что разработчик выбрал самый простой способ, когда они реализовали эту функциональность, не задумываясь об этом.
Кажется, что первоначальная реализация приземлилась в 2000-07-03 (два десятилетия назад!). Соответствующая часть выглядит так ( источник ):
Примечательно, что он вспыхивает, когда видит
CPP_GREATER
токен (то есть>
), прежде чем резервировать память для токена. Это имеет смысл, поскольку нет необходимости выделять память, когда токен не будет записан в буфер.Затем, только после того, как память зарезервирована, препроцессор проверяет, имеет ли токен предшествующий пробел (
t->flags & PREV_WHITE
), и, когда это происходит, записывает символ пробела в буфер.В результате в
< foo / bar >
, сохраняются только пробелы доfoo
(то есть после начального<
)/
иbar
.источник
if (t->flags & PREV_WHITE) CPP_PUTC_Q (pfile, ' ');
противоречит тому, что говорится в документе: «Любой пробел между токенами сводится к одному пробелу; ...»?