Was ist der Zweck eines einzelnen Pfund- / Hash-Zeichens (#) in einer eigenen Zeile im C / C ++ - Präprozessor?

145

Ich habe mir den Quellcode der Boost- Bibliotheken angesehen und festgestellt, dass häufig einzelne Pfundzeichen ohne Präprozessoranweisungen vorhanden sind. Ich habe das Handbuch und die Spezifikationsanleitung des GCC-Präprozessors gelesen und kann nichts darüber finden.

(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

In Zeile 4 steht nach dem Pfundzeichen nichts mehr. Welchen Effekt hat das? Ist es in der C-Präprozessor-Spezifikation (CPP) definiert?

Da Boost eine plattformübergreifende Bibliothek ist, würde ich davon ausgehen, dass jeder CPP sie korrekt analysieren sollte. Was wären die Auswirkungen / Nebenwirkungen von zufälligen Pfund- / Hash-Zeichen im gesamten Code?

Callyalater
quelle
6
@Zaibis zB. Der ausführbare Name des Präprozessors in der GCC-Suite ist "cpp" (während die Compiler gcc und g ++ sind)
deviantfan
3
CPP steht für C-Plus-Plus.
Djeidot
6
Nicht komplett. Siehe den ersten Satz von en.wikipedia.org/wiki/C_preprocessor
P45
7
@djeidot "cpp" ist mehrdeutig. Aus diesem Grund verwenden die Benutzer "c ++" oder "cxx" (x sieht aus wie + um 45 Grad gedreht), wenn sie sich auf C-Plus-Plus beziehen.
Mike Ounsworth
12
@djeidot Nein, CPP ist der C-PreProcessor. Es existierte lange bevor es C ++ überhaupt gab.
Leandros

Antworten:

185

A #alleine auf einer Linie hat überhaupt keine Wirkung. Ich gehe davon aus, dass es für den ästhetischen Wert verwendet wird.

Der C-Standard sagt:

6.10.7 Null-Direktive

Semantik

Eine Vorverarbeitungsanweisung des Formulars

# new-line

hat keine Wirkung.

Der C ++ - Standard sagt dasselbe:

16.7 Null-Direktive [cpp.null]

Eine Vorverarbeitungsanweisung des Formulars

# new-line

hat keine Wirkung.

Jonathan Wakely
quelle
4
Dies erklärt jedoch weder den Zweck der Verwendung noch die Begründung für seine Existenz.
StellarVortex
8
"Welchen Effekt hat dies? Ist es in der C-Präprozessor-Spezifikation (CPP) definiert? ... Was wären die Auswirkungen / Nebenwirkungen von zufälligen Pfund- / Hash-Zeichen im gesamten Code?" Das habe ich beantwortet. Es hat keine Wirkung, aber ich wollte nicht über den Grund des Autors spekulieren, es zu verwenden. Ich habe es jetzt getan.
Jonathan Wakely
Sie haben die richtigen Antworten erhalten, dass dies für den Präprozessor nichts bedeutet. Ich werde spekulieren, dass es einem anderen Programm (wie einer IDE oder LINT) helfen könnte, einen Block von Anweisungen als logische Einheit zusammenzuhalten. Bei einigen IDEs können Programmierer Textblöcke erweitern oder reduzieren, um die logische Struktur der Datei zu verfolgen.
Spencer
107

Dadurch sieht der Quellcode hübsch aus, das ist alles.

Hebt die Tatsache hervor, dass der gesamte Block ein Präprozessorabschnitt ist.

Und in der Tat, sowohl die C- und C ++ Preprozessoren muss ignorieren #auf einer Linie.

P45 unmittelbar bevorstehend
quelle
16
Außerdem wird die Navigation in einigen Texteditoren (z. B. {oder }in vim) vereinfacht .
wchargin
@WChargin, das hängt davon ab, wie du es betrachtest. Wenn Sie zwischen den beiden Präprozessorblöcken navigieren #möchten, können Sie durch Hinzufügen von {oder nicht hinzufügen }. Tatsächlich ist es möglicherweise einfacher, }zweimal zu drücken, um über den Block zu springen (im Beispiel des OP), als nicht in die Mitte der beiden Blöcke zu springen.
Shahbaz
3
@ Shahbaz Sicher! Meine Faustregel lautet "logische Einheiten zusammenhalten", so dass "Absatz" wirklich "Idee" bedeutet. Ich würde dieser Regel auch Präprozessordeklarationen folgen. Natürlich ist es in hohem Maße eine Frage des persönlichen Stils.
wchargin
46

Überprüfen Sie immer eine maßgebliche Quelle, anstatt sich auf andere Ressourcen zu verlassen. C ist standardisiert als ISO 9899 :: 2011, C ++ hat auch einen ISO-Standard. Beide werden gut angenommen und die endgültigen Entwürfe durch eine kurze Suche verfügbar. Der C-Standard besagt in 6.10.7 (C ++ hat fast den gleichen Text):

Eine Vorverarbeitungsanweisung des Formulars

# new-line

hat keine Wirkung.

Dies ist eine Null-Direktive , ebenso wie eine Null-Anweisung; ohne vorhergehenden Ausdruck in der Kernsprache eine Null-Anweisung ist .

Für den Präprozessor ist es nur zur Formatierung / Lesbarkeit hervorzuheben, dass die Zeilen semantisch zusammengehören. (Das Semikolon OTOH ist semantisch relevant).

zu ehrlich für diese Seite
quelle