Я предполагаю, что сначала обрабатываются комментарии, затем препроцессор, а затем код. Комментарии всегда обрабатываются перед препроцессором?
Вроде как -- часть задания препроцессора - для удаления комментариев. В этом случае неважно, есть ли директива внутри комментариев, она все равно удалена, как и любой другой комментарий.
Некоторые быстрые исследования показывают, что комментарии преобразуются в белые пробела препроцессором . Таким образом, все это часть одного потока.
Согласно Википедии, комментарии обрабатываются перед директивами препроцессора.
.Согласно стандарту языка Си, во время трансляции (компиляции) программы существует 8 фаз перевода. Каждый комментарий на 3-й фазе трансляции заменяется пробелом, а директивы препроцессирования выполняются на 4-й фазе
.]Да, с точки зрения стандарта языка, комментарии обрабатываются (заменяются пробелами) [] до того, как [] препроцессор начинает свою работу. [
] []В практических реализациях обработка комментариев может выполняться тем же кодом (например, тем же исполняемым файлом), который обрабатывает директивы препроцессора и осуществляет макроподстановку, но результат должен быть тем же: комментарии не влияют на собственно препроцессор.[
] []В более старом и/или нестандартном коде иногда можно встретить трюки, основанные на нестандартном поведении с использованием специфических для реализации комментариев, в отличие от комментариев, которые могут быть получены в результате работы препроцессора, а не в результате работы препроцессора. отношения препроцессора, как, например, создание комментариев с помощью директив препроцессора[
] [#define CONCAT(a, b) a##b
#define BEGIN_COMMENT CONCAT(/, *)
#define END_COMMENT CONCAT(*, /)
BEGIN_COMMENT
This code is supposedly commented-out
END_COMMENT
]
[]или использование комментариев для конкатенации на уровне препроцессора (с компиляторами языка Си, которые не поддерживали оператор []##[
] в макроопределениях)[
#define OLD_CONCAT(a, b) a/**/b
]
[]Ни один из таких трюков не легален в стандартном языке Си. Ни один из них на самом деле не работает.[
].Да, препроцессор заменяет комментарии перед обработкой директив.
Из раздела 5.1.1.2 (Фазы перевода) стандарта C99:
3) Исходный файл разлагается на маркеры препроцессирования и последовательности символов белого пробела (включая комментарии)..... Каждый комментарий заменяется одним пробелом.....
4) Выполняются директивы препроцессирования, расширяются макроинвекции, .....