147 votes

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

J'ai regardé les Boost et j'ai remarqué qu'il y a souvent des signes dièses simples sans aucune directive de préprocesseur. J'ai lu le manuel et le guide de spécification du préprocesseur de GCC et je n'ai rien trouvé à 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

À 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. Quel serait l'effet/les effets secondaires d'avoir des signes dièse/hache aléatoires dans le code ?

1 votes

Juste par curiosité : CPP est-il une abréviation valide pour le préprocesseur C ? J'ai été assez confus en lisant l'OP.

6 votes

@Zaibis Par exemple, le nom exécutable du préprocesseur dans la suite GCC est "cpp" (alors que les compilateurs sont gcc et g++).

4 votes

CPP est l'abréviation de C-Plus-Plus.

188voto

Jonathan Wakely Points 45593

A # seul sur une ligne n'a aucun effet. Je suppose que c'est utilisé pour des raisons esthétiques.

La norme C dit :

6.10.7 Directive Null

Sémantique

Une directive de prétraitement de la forme

# new-line

n'a aucun effet.

La norme C++ dit la même chose :

16.7 Directive Null [cpp.null].

Une directive de prétraitement de la forme

# new-line

n'a aucun effet.

4 votes

Mais cela n'explique pas le but de son utilisation, ni ne donne la raison de son existence.

9 votes

"Quel effet cela a-t-il ? Est-il défini dans la spécification du préprocesseur C (CPP) ? ... Quel serait l'effet/les effets secondaires d'avoir des signes dièse/hache aléatoires dans tout le code ?" C'est ce que j'ai répondu. Il n'a aucun effet, mais je ne voulais pas spéculer sur la raison pour laquelle l'auteur l'a utilisé. Je l'ai fait maintenant.

0 votes

On vous a répondu correctement que cela ne signifie rien pour le préprocesseur ; je vais spéculer que cela peut aider un autre programme (comme un IDE ou LINT) à garder un bloc de directives ensemble comme une unité logique. Certains IDEs permettent aux programmeurs d'étendre ou de réduire les blocs de texte pour les aider à garder la trace de la structure logique du fichier.

110voto

Slodge Monster Points 1129

Ça rend le code source joli, c'est tout.

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

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

16 votes

Et facilite également la navigation dans certains éditeurs de texte (par ex, { o } dans vim).

0 votes

@WChargin, cela dépend de la façon dont vous voyez les choses. Si vous voulez naviguer entre les deux blocs de préprocesseur, ajouter # vous empêcherait d'utiliser { o } . En fait, il peut être plus facile d'appuyer sur } 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.

3 votes

@Shahbaz Certainement ! Ma règle de base est "garder les unités logiques ensemble", de sorte que "paragraphe" signifie vraiment "idée". Je suivrais cette règle avec les déclarations de préprocesseur, aussi. Bien sûr, c'est une question de style personnel dans une large mesure.

47voto

Olaf Points 9969

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

Une directive de prétraitement de la forme

# new-line

n'a aucun effet.

Il s'agit d'un directive nulle autant qu'un ; sans une expression précédente dans le langage de base est un déclaration nulle .

Pour le préprocesseur, il s'agit simplement de mettre en évidence, pour des raisons de formatage et de lisibilité, l'appartenance sémantique des lignes entre elles. (le point-virgule, quant à lui, est sémantiquement pertinent).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X