Что делает препроцессор C ++, когда в строке всего один символ `#` - и ничего больше? - PullRequest
3 голосов
/ 29 мая 2020

Это допустимая строка C ++? Что это должно означать?

#

А как насчет этого:

# // a comment

Последние компиляторы, похоже, игнорируют его без ошибок и предупреждений.

Это? ничего не делать"? У меня есть файл заголовка, в котором вылетает раздел «совместимость» при компиляции с g ++ 7.4.0 при наличии таких строк. Кажется, это не сбивает с толку компиляторы, которые видят, что эта строка исключена в неактивной ветке #if.

Примечание: g cc 7.4.0 в Debian Bioni c (на данный момент запись) на Travis CI срабатывает такие строки.

1 Ответ

8 голосов
/ 29 мая 2020

Оба примера действительны и ничего не делают.

Для второго примера сначала удаляются комментарии на этапе перевода 3 :

. .. Каждый комментарий заменяется одним пробелом. Символы новой строки сохраняются. ...

, что приводит к первому случаю, который является директивой препроцессора, которая раскрывается в фазе перевода 4 :

Директивы предварительной обработки выполнено, ...

Эта директива препроцессора действительна, называется Null directive и не действует, как указано здесь :

Директива предварительной обработки вида

# новая строка

не имеет никакого эффекта.

где новая строка - это буквально символ новой строки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...