Я просматривал исходный код библиотек 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 должен правильно ее анализировать. Каков будет эффект / побочные эффекты наличия случайных знаков фунта / хеша по всему коду?
c++
c
boost
c-preprocessor
callyalater
источник
источник
Ответы:
Сам
#
по себе на линии не имеет никакого эффекта вообще. Я предполагаю, что это используется для эстетической ценности.Стандарт C гласит:
Стандарт C ++ говорит то же самое:
источник
Это делает исходный код красивым, вот и все.
Выделяется тот факт, что весь блок является препроцессорной секцией.
И действительно, препроцессоры C и C ++ должны игнорировать
#
в строке.источник
{
или}
в vim).#
помешает вам использовать{
или}
. Фактически, может быть легче}
дважды нажать, чтобы перепрыгнуть через блок (в примере OP), чем не быть в состоянии перейти к середине двух блоков.Всегда проверяйте достоверный источник, а не полагайтесь на другие ресурсы. C стандартизирован как ISO 9899 :: 2011, C ++ также имеет стандарт ISO. И то, и другое хорошо приняты, а окончательные проекты доступны после короткого поиска. Стандарт C утверждает в 6.10.7 (C ++ имеет почти такой же текст):
Это нулевая директива , поскольку выражение
;
без предшествующего выражения в языке ядра является пустым выражением .Для препроцессора это просто для форматирования / читабельности, чтобы подчеркнуть, что строки семантически связаны друг с другом. (точка с запятой OTOH семантически релевантна).
источник