Каково назначение одного знака фунта / хеша (#) на отдельной строке в препроцессоре 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.