À quoi sert un seul signe dièse / hachage (#) sur sa propre ligne dans le préprocesseur C / C ++?

145

J'ai regardé le code source des bibliothèques Boost , et j'ai remarqué qu'il y a souvent des signes dièse sans aucune directive de préprocesseur qui leur est attachée. J'ai lu le manuel et le guide des spécifications du préprocesseur GCC et je ne trouve rien à ce sujet.

(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

Sur la ligne 4, il n'y a rien après le signe dièse. Quel effet cela a-t-il? Est-il défini dans la spécification du préprocesseur C (CPP)?

Comme Boost est une bibliothèque multiplateforme, je suppose que tout CPP devrait l'analyser correctement. Quels seraient les effets / effets secondaires d'avoir des signes dièse / hachage aléatoires dans tout le code?

callyalater
la source
6
@Zaibis Par exemple. le nom de l'exécutable du préprocesseur dans la suite GCC est "cpp" (alors que les compilateurs sont gcc et g ++)
deviantfan
3
CPP signifie C-Plus-Plus.
djeidot le
6
Pas entièrement. Voir la première phrase de en.wikipedia.org/wiki/C_preprocessor
P45 imminent le
7
@djeidot "cpp" est ambigu. C'est pourquoi les gens utilisent "c ++" ou "cxx" (x ressemble à + tourné à 45 degrés) en se référant à C-Plus-Plus.
Mike Ounsworth le
12
@djeidot Non, CPP est le C-PreProcessor. Il existait bien avant même que C ++ existe.
Leandros

Réponses:

185

Un #seul sur une ligne n'a aucun effet. Je suppose qu'il est utilisé à des fins esthétiques.

La norme C dit:

6.10.7 Directive nulle

Sémantique

Une directive de prétraitement du formulaire

# new-line

n'a aucun effet.

Le standard C ++ dit la même chose:

16.7 Directive Null [cpp.null]

Une directive de prétraitement du formulaire

# new-line

n'a aucun effet.

Jonathan Wakely
la source
4
Cela n'explique pas le but de son utilisation, cependant, ni ne donne la justification de son existence.
StellarVortex
8
"Quel effet cela a-t-il? Est-il défini dans la spécification du préprocesseur C (CPP)? ... Quels seraient les effets / effets secondaires d'avoir des signes dièse / hachage aléatoires dans tout le code?" C'est ce que j'ai répondu. Cela n'a aucun effet, mais je ne voulais pas spéculer sur la raison pour laquelle l'auteur l'utilisait. Je l'ai fait maintenant.
Jonathan Wakely le
Vous avez reçu des réponses correctes indiquant que cela ne signifie rien pour le préprocesseur; Je vais spéculer que cela peut aider un autre programme (tel qu'un IDE ou LINT) à garder un bloc de directives ensemble en tant qu'unité logique. Certains IDE permettent aux programmeurs de développer ou de réduire des blocs de texte pour les aider à suivre la structure logique du fichier.
Spencer
107

Cela rend le code source joli, c'est tout.

Met en évidence le fait que l'ensemble du bloc est une section de préprocesseur.

Et en effet, les préprocesseurs C et C ++ doivent ignorer #sur une ligne.

P45 imminent
la source
16
Et facilite également la navigation dans certains éditeurs de texte (par exemple, {ou }dans vim).
wchargin le
@WChargin, cela dépend de la façon dont vous le regardez. Si vous souhaitez naviguer entre les deux blocs de préprocesseur, l'ajout #vous empêcherait d'utiliser {ou }. En fait, il peut être plus facile d'appuyer }deux fois pour sauter par-dessus le bloc (dans l'exemple de l'OP) que de ne pas pouvoir sauter au milieu des deux blocs.
Shahbaz
3
@Shahbaz Certainement! Ma règle d'or est "garder les unités logiques ensemble", de sorte que "paragraphe" signifie vraiment "idée". Je suivrais également cette règle avec les déclarations de préprocesseur. Bien sûr, c'est une question de style personnel dans une large mesure.
wchargin
46

Vérifiez toujours une source faisant autorité au lieu de vous fier à d'autres ressources. C est normalisé comme ISO 9899 :: 2011, C ++ a également une norme ISO. Les deux sont bien acceptés et les versions finales disponibles par une courte recherche. Le standard C indique dans 6.10.7 (C ++ a à peu près le même texte):

Une directive de prétraitement du formulaire

# new-line

n'a aucun effet.

Il s'agit d'une directive null , autant qu'une instruction; sans expression précédente dans le langage de base est une instruction null .

Pour le préprocesseur, c'est juste pour le formatage / la lisibilité de mettre en évidence que les lignes appartiennent sémantiquement ensemble. (le point-virgule OTOH est sémantiquement pertinent).

trop honnête pour ce site
la source