Комментарии всегда обрабатываются перед препроцессором? [дубликат]

5
задан Brian Tompsett - 汤莱恩 20 February 2016 в 10:00
поделиться

6 ответов

Я предполагаю, что сначала обрабатываются комментарии, затем препроцессор, а затем код. Комментарии всегда обрабатываются перед препроцессором?

Вроде как -- часть задания препроцессора - для удаления комментариев. В этом случае неважно, есть ли директива внутри комментариев, она все равно удалена, как и любой другой комментарий.

9
ответ дан 18 December 2019 в 05:28
поделиться

Некоторые быстрые исследования показывают, что комментарии преобразуются в белые пробела препроцессором . Таким образом, все это часть одного потока.

Согласно Википедии, комментарии обрабатываются перед директивами препроцессора.

.
3
ответ дан 18 December 2019 в 05:28
поделиться

Согласно стандарту языка Си, во время трансляции (компиляции) программы существует 8 фаз перевода. Каждый комментарий на 3-й фазе трансляции заменяется пробелом, а директивы препроцессирования выполняются на 4-й фазе

.
10
ответ дан 18 December 2019 в 05:28
поделиться

Да (в каждой разумной вселенной).

2
ответ дан 18 December 2019 в 05:28
поделиться
[

]Да, с точки зрения стандарта языка, комментарии обрабатываются (заменяются пробелами) [] до того, как [] препроцессор начинает свою работу. [

] [

]В практических реализациях обработка комментариев может выполняться тем же кодом (например, тем же исполняемым файлом), который обрабатывает директивы препроцессора и осуществляет макроподстановку, но результат должен быть тем же: комментарии не влияют на собственно препроцессор.[

] [

]В более старом и/или нестандартном коде иногда можно встретить трюки, основанные на нестандартном поведении с использованием специфических для реализации комментариев, в отличие от комментариев, которые могут быть получены в результате работы препроцессора, а не в результате работы препроцессора. отношения препроцессора, как, например, создание комментариев с помощью директив препроцессора[

] [
#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
] [

]Ни один из таких трюков не легален в стандартном языке Си. Ни один из них на самом деле не работает.[

].
4
ответ дан 18 December 2019 в 05:28
поделиться

Да, препроцессор заменяет комментарии перед обработкой директив.

Из раздела 5.1.1.2 (Фазы перевода) стандарта C99:

3) Исходный файл разлагается на маркеры препроцессирования и последовательности символов белого пробела (включая комментарии)..... Каждый комментарий заменяется одним пробелом.....

4) Выполняются директивы препроцессирования, расширяются макроинвекции, .....

7
ответ дан 18 December 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: