What is the purpose of a single pound/hash sign (#) on its own line in the C/C++ preprocessor?

C++CBoostC Preprocessor

C++ Problem Overview


I have been looking at the Boost libraries source code, and I have noticed that often there are single pound signs without any preprocessor directives attached to them. I read through the GCC preprocessor manual and specification guide and can't find anything about it.

(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

On line 4, there is nothing after the pound sign. What effect does this have? Is it defined in the C preprocessor (CPP) specification?

As Boost is a cross-platform library, I would assume that any CPP should parse it correctly. What would the effect/side-effects be of having random pound/hash signs throughout the code?

C++ Solutions


Solution 1 - C++

A # on its own on a line has no effect at all. I assume it's being used for aesthetic value.

The C standard says:

> 6.10.7 Null directive > > Semantics > > A preprocessing directive of the form > > # new-line > >has no effect.

The C++ standard says the same thing:

> 16.7 Null directive [cpp.null] > > A preprocessing directive of the form > > # new-line > >has no effect.

Solution 2 - C++

It makes the source code look pretty, that's all.

Highlights the fact that the whole block is a preprocessor section.

And indeed, both the C and C++ preprocessors must ignore # on a line.

Solution 3 - C++

Always check an authoritative source instead of relying on other resources. C is standardised as ISO 9899::2011, C++ also has an ISO standard. Both are well accepted and the final drafts available by a short search. The C standard states in 6.10.7 (C++ has much the same text):

> A preprocessing directive of the form > > # new-line > > has no effect.

This is a null directive, as much as an ; without a preceeding expression in the core-language is a null statement .

For the preprocessor it is just for formatting/readability to highlight that the lines belong semantically together. (the semicolon OTOH is semantically relevant).

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncallyalaterView Question on Stackoverflow
Solution 1 - C++Jonathan WakelyView Answer on Stackoverflow
Solution 2 - C++P45 ImminentView Answer on Stackoverflow
Solution 3 - C++too honest for this siteView Answer on Stackoverflow