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

Lesezeit: 3 Minuten

Benutzeravatar von callyalater
kalla später

Ich habe mir die angeschaut Schub Libraries-Quellcode, und mir ist aufgefallen, dass es oft einzelne Nummernzeichen gibt, denen keine Präprozessoranweisungen angehängt sind. Ich habe das GCC-Präprozessorhandbuch und den Spezifikationsleitfaden 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 Nummernzeichen nichts mehr. Welche Wirkung hat dies? Ist es in der Spezifikation des C-Präprozessors (CPP) definiert?

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

  • @ Zaibis Bsp. der ausführbare Name des Präprozessors in der GCC-Suite ist “cpp” (während die Compiler gcc und g++ sind)

    – Abweichler

    5. Februar 2016 um 11:14 Uhr

  • CPP steht für C-Plus-Plus.

    – djeidot

    5. Februar 2016 um 15:25 Uhr


  • Nicht komplett. Siehe den ersten Satz von en.wikipedia.org/wiki/C_preprocessor

    – P45 Unmittelbar bevorstehend

    5. Februar 2016 um 15:26 Uhr

  • @djeidot “cpp” ist mehrdeutig. Aus diesem Grund verwenden die Leute “c++” oder “cxx” (x sieht aus wie + um 45 Grad gedreht), wenn sie sich auf C-Plus-Plus beziehen.

    – Mike Ounsworth

    5. Februar 2016 um 16:30 Uhr

  • @djeidot Nein, CPP ist der C-PreProcessor. Es existierte lange bevor C++ überhaupt existierte.

    – Leandros

    6. Februar 2016 um 23:39 Uhr

Benutzeravatar von Jonathan Wakely
Jonathan Wakely

EIN # allein auf einer Linie hat überhaupt keine Wirkung. Ich nehme an, es dient dem ästhetischen Wert.

Die C-Norm 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.

  • Dies erklärt jedoch weder den Zweck seiner Verwendung noch die Begründung für seine Existenz.

    – StellarVortex

    9. Februar 2016 um 19:23 Uhr

  • „Welche Auswirkung hat das? Ist es in der C-Präprozessorspezifikation (CPP) definiert? Das habe ich geantwortet. Es hat keine Wirkung, aber ich wollte nicht über den Grund des Autors spekulieren, es zu verwenden. Das habe ich jetzt getan.

    – Jonathan Wakely

    9. Februar 2016 um 19:47 Uhr


  • Sie haben richtige Antworten erhalten, dass es 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. Einige IDEs ermöglichen es Programmierern, Textblöcke zu erweitern oder zu reduzieren, um ihnen zu helfen, den Überblick über die logische Struktur der Datei zu behalten.

    – Spencer

    12. August 2017 um 1:50 Uhr

Es lässt den Quellcode hübsch aussehen, das ist alles.

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

Und zwar sowohl die C- als auch die C++-Präprozessoren muss ignorieren # auf einer Linie.

  • Und erleichtert auch die Navigation in einigen Texteditoren (z. B. { oder } im Vim).

    – Waschen

    4. Februar 2016 um 19:43 Uhr

  • @WChargin, das hängt davon ab, wie Sie es betrachten. Wenn Sie zwischen den beiden Präprozessorblöcken navigieren möchten, fügen Sie hinzu # würde Sie von der Verwendung abhalten { oder }. Tatsächlich kann es einfacher sein, zu drücken } zweimal über den Block zu springen (im Beispiel des OP), als nicht in die Mitte der beiden Blöcke springen zu können.

    – Shahbaz

    7. Februar 2016 um 7:29 Uhr

  • @Shahbaz Sicherlich! Meine Faustregel lautet: „Logische Einheiten zusammenhalten“, damit „Absatz“ wirklich „Idee“ bedeutet. Ich würde diese Regel auch mit Präprozessordeklarationen befolgen. Natürlich ist es in hohem Maße eine Frage des persönlichen Stils.

    – Waschen

    7. Februar 2016 um 14:08 Uhr

zu ehrlich für den Benutzer-Avatar dieser Seite
zu ehrlich für diese Seite

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

Eine Vorverarbeitungsanweisung des Formulars

# new-line

hat keine Wirkung.

Das ist ein Null Direktiveso viel wie ein ; ohne vorangestellten Ausdruck in der Kernsprache ist a Null-Aussage .

Für den Präprozessor dient es lediglich der Formatierung/Lesbarkeit, hervorzuheben, dass die Zeilen semantisch zusammengehören. (das Semikolon OTOH ist semantisch relevant).

1424090cookie-checkWas ist der Zweck eines einzelnen Nummern-/Hash-Zeichens (#) in einer eigenen Zeile im C/C++-Präprozessor?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy