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