Каково назначение одного знака фунта / хеша (#) на отдельной строке в препроцессоре C / C ++?


145

Я просматривал исходный код библиотек Boost и заметил, что часто встречаются знаки с одним фунтом без каких-либо прикрепленных к ним директив препроцессора. Я прочитал руководство по препроцессору GCC и руководство по спецификации и ничего не могу найти по этому поводу.

(1) #ifndef BOOST_CONFIG_HPP
(2) #  include <boost/config.hpp>
(3) #endif
(4) #
(5) #if defined(BOOST_HAS_PRAGMA_ONCE)
(6) #  pragma once
(7) #endif

В строке 4 после знака фунта ничего нет. Какой эффект это имеет? Это определено в спецификации препроцессора C (CPP)?

Поскольку Boost является кроссплатформенной библиотекой, я бы предположил, что любой CPP должен правильно ее анализировать. Каков будет эффект / побочные эффекты наличия случайных знаков фунта / хеша по всему коду?


6
@ Зайбис, например имя исполняемого файла препроцессора в наборе GCC - «cpp» (в то время как компиляторы - gcc и g ++)
— deviantfan

3
CPP расшифровывается как C-Plus-Plus.
— джеидот

6
Не совсем. См. Первое предложение en.wikipedia.org/wiki/C_preprocessor
— P45, неизбежное

7
@djeidot "cpp" неоднозначно. Вот почему люди используют «c ++» или «cxx» (х выглядит как + повернутый на 45 градусов) при обращении к C-Plus-Plus.
— Майк Оунсворт

12
@djeidot Нет, CPP - это C-препроцессор. Он существовал еще до C ++.
— Леандрос

Ответы:


185

Сам #по себе на линии не имеет никакого эффекта вообще. Я предполагаю, что это используется для эстетической ценности.

Стандарт C гласит:

6.10.7 Нулевая директива

Семантика

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

# new-line

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

Стандарт C ++ говорит то же самое:

16.7 Нулевая директива [cpp.null]

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

# new-line

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


4
Это не объясняет цели его использования и не дает оснований для его существования.
— StellarVortex

8
«Какой эффект это имеет? Определено ли это в спецификации препроцессора C (CPP)? ... Каков будет эффект / побочные эффекты наличия случайных знаков фунта / хеша во всем коде?» Вот что я ответил. Это не имеет никакого эффекта, но я не хотел размышлять о причине автора, чтобы использовать это. Я сделал это сейчас.
— Джонатан Уэйкли

Вам дали правильные ответы, что это ничего не значит для препроцессора; Я собираюсь предположить, что это может помочь какой-то другой программе (такой как IDE или LINT) хранить блок директив вместе как логическую единицу. Некоторые IDE позволяют программистам расширять или сворачивать блоки текста, чтобы помочь им отслеживать логическую структуру файла.
— Спенсер

107

Это делает исходный код красивым, вот и все.

Выделяется тот факт, что весь блок является препроцессорной секцией.

И действительно, препроцессоры C и C ++ должны игнорировать #в строке.


16
А также облегчает навигацию в некоторых текстовых редакторах (например, {или }в vim).
— wchargin

@WChargin, это зависит от того, как вы на это смотрите. Если вы хотите перейти между двумя блоками препроцессора, добавление #помешает вам использовать {или }. Фактически, может быть легче }дважды нажать, чтобы перепрыгнуть через блок (в примере OP), чем не быть в состоянии перейти к середине двух блоков.
— Шахбаз

3
@ Shahbaz Конечно! Мое эмпирическое правило гласит: «Держите логические единицы вместе», так что «параграф» действительно означает «идея» Я бы также следовал этому правилу с объявлениями препроцессора. Конечно, это в значительной степени вопрос личного стиля.
— wchargin

46

Всегда проверяйте достоверный источник, а не полагайтесь на другие ресурсы. C стандартизирован как ISO 9899 :: 2011, C ++ также имеет стандарт ISO. И то, и другое хорошо приняты, а окончательные проекты доступны после короткого поиска. Стандарт C утверждает в 6.10.7 (C ++ имеет почти такой же текст):

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

# new-line

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

Это нулевая директива , поскольку выражение ;без предшествующего выражения в языке ядра является пустым выражением .

Для препроцессора это просто для форматирования / читабельности, чтобы подчеркнуть, что строки семантически связаны друг с другом. (точка с запятой OTOH семантически релевантна).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.