2015-11-06 4 views
5

Я имею в виду что-то вроде этого:Разрешены ли комментарии в той же строке, что и директивы препроцессора, и каково их значение в таком случае?

#include <iostream> // Comment 

Ну, cppreference.com (http://en.cppreference.com/w/cpp/preprocessor) утверждает, что:

директивы предобработки управления поведением препроцессора. Каждая директива занимает одну строку и имеет следующий формат:

# символов инструкции предварительной обработки (один из определения, UNDEF, включают в себя, если, IFDEF, IfNDef, иначе, Элиф, ENDIF, линия, ошибка, Прагма) аргументы (зависит от инструкции) разрыв строки

Так же, полная спецификация всей линии дается, и там нет места для комментариев нет. Представление комментариев не разрешено в таких случаях.

Однако, как g ++, так и clang ++ принимают такой ввод даже с -Wall -Wextra -Wpedantic. Также cplusplus.com приводятся примеры таких комментариев: http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

Я еще больше смущает тот факт, что кто-то сказал мне, что «Это остается в силе, чтобы положить комментарии в # строк, но они не могут означать, что вы хотите» , Я не уверен, как это может быть так, так как согласно http://en.cppreference.com/w/cpp/language/translation_phases комментарии заменяются символами пробела перед запуском препроцессора, поэтому, если они разрешены на # строках, как они могут помешать семантике такой строки?

ответ

9

Как указано в фазах перевода документ, который вы связаны с: Комментарии заменяются пробелами в шаге 3 фазы 3. Препроцессор выполняется в фазе 4.

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

 Смежные вопросы

  • Нет связанных вопросов^_^