Какова цель одного знака фунта/хэша (#) в его собственной строке в препроцессоре C/С++?
Я изучал исходный код 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 должен правильно ее разобрать. Каким будет эффект/побочные эффекты наличия случайных значков фунта/хэша в течение всего кода?
Ответы
Ответ 1
A #
сам по себе на линии не имеет никакого эффекта. Я предполагаю, что он используется для эстетической ценности.
В стандарте C говорится:
6.10.7 Null директива
Семантика
Директива предварительной обработки формы
# new-line
не имеет эффекта.
Стандарт С++ говорит то же самое:
16.7 Нулевая директива [cpp.null]
Директива предварительной обработки формы
# new-line
не имеет эффекта.
Ответ 2
Это делает исходный код красивым, все.
Указывает на то, что весь блок является сектором препроцессора.
И действительно, оба препроцессора C и С++ должны игнорировать #
в строке.
Ответ 3
Всегда проверяйте авторитетный источник вместо того, чтобы полагаться на другие ресурсы. C стандартизован как ISO 9899:: 2011, С++ также имеет стандарт ISO. Оба они хорошо приняты, и окончательные проекты доступны для краткого поиска. Стандарт C в 6.10.7 (С++ имеет тот же текст):
Директива предварительной обработки формы
# new-line
не имеет эффекта.
Это директива null, а ;
без предшествующего выражения на языке ядра - это нулевой оператор.
Для препроцессора это просто для форматирования/удобочитаемости, чтобы подчеркнуть, что линии принадлежат семантически вместе. (точка с запятой OTOH является семантически релевантной).