Warum beginnt jede .h-Datei mit #ifndef #define #endif? Wir können das Programm ohne diese Richtlinien sicherlich zusammenstellen.In C und C++, warum ist jede .h-Datei normalerweise mit #ifndef #define #endif -Direktiven umgeben?
In C und C++, warum ist jede .h-Datei normalerweise mit #ifndef #define #endif -Direktiven umgeben?
Antwort
Es ist ein sogenannter "include guard". Der Zweck besteht darin, zu verhindern, dass die Datei mehrfach analysiert werden muss, wenn sie mehrfach enthalten ist.
Und um mehrere Definitionen der gleichen Klasse zu verhindern. – James
Gab es jemals eine # Importanweisung, oder ist das nur meine Vorstellung? –
@Autopulated: Das ist, was er meint, indem er mehrfach geparst wird. Es gibt mehr Dinge als Klassenredefinitionen, um die man sich kümmern muss; Alle sind durch "multiple parsing" gekapselt. – GManNickG
Es wird ein Einschließenwächter genannt. Sie können ohne sie schreiben, bis Sie mit dem Schreiben großer Programme beginnen und herausfinden, dass Sie die gleiche .h-Datei mehr als einmal direkt oder indirekt aus einer C-Datei einbeziehen müssen. Dann ohne Wächter würden Sie mehrere Definitionsfehler bekommen, aber mit ihnen wird der Inhalt der Headerdatei nur einmal analysiert und alle nachfolgenden Male übersprungen, um diese Fehler zu vermeiden. Es ist eine gute Übung, sie immer zu benutzen.
Es verhindert mehrfache Einschlüsse einer einzelnen Datei. Das gleiche gilt
#pragma once
Direktive getan werden, aber diese #ifndefs sind Standard somit von jedem Compiler unterstützt.
#pragma einmal. Ist eine Compiler-spezifische Erweiterung. –
... aber eine weit verbreitete, um fair zu sein –
Wenn eine Header-Datei eine Definition wie
int i;enthält, wird ein Kompilierungsfehler erzeugt, wenn sie mehrmals ohne Guard eingeschlossen wird.
Wenn ifndef prüft, dass eine Präprozessorvariable nicht definiert ist (und dies nicht zum ersten Mal ist), wird sie explizit definiert, um zu vermeiden, dass sie erneut erfasst wird. In MSVC können Sie auch
#pragma oncestatt
ifndef
verwenden.
Wenn ich richtig verstehe, möchten Sie wissen, ob, einschließlich der Abwesenheit von Wachen, eine Headerdatei mehrere Male einen Fehler oder ein gefährliches Verhalten verursachen kann. Dies geschieht nach dem Ausschließen mehrerer Definitionen usw.
Stellen Sie sich einen bösartigen Programmierer vor, dessen Header-Datei nicht über die Include-Wächter verfügt. Seine Header-Datei definiert ein Makro, SZ
, das eine Größe ist, die Sie für Ihre statisch zugewiesenen Arrays verwenden. Der Programmierer könnte seine Header-Datei wie folgt schreiben:
#ifndef SZ
#define SZ 1024
#else
#if SZ == 1024
#undef SZ
#define SZ 128
#else
#error "You can include me no more than two times!"
#endif
#endif
Nun, wenn Sie die Header-Datei einmal schließen Sie SZ
gleich 1024. bekommen Wenn Sie es zweimal enthalten, SZ
wird 128. Natürlich sind die meisten Echt Weltprogrammierer sind nicht bösartig, und niemand schreibt wirklich Code wie oben.
beachten, dass der C-Standard erlaubt assert.h
#include
d mehr als einmal mit unterschiedlichem Verhalten abhängig davon, ob NDEBUG
zum Zeitpunkt der Aufnahme von assert.h
definiert ist. Also, assert.h
kann keine Wachen enthalten. Das ist ein Feature, kein Fehler.
- 1. Best-Practice auf C-Header-Dateien mit #ifndef #define #endif
- 2. Warum werden #ifndef und #define in C++ - Headerdateien verwendet?
- 3. Verwendet #ifndef und #define in C++ veraltet?
- 4. benötigen Klärung #ifndef #define
- 5. #define und #include Ordnung in C
- 6. C# Compiler-Direktiven
- 7. #define Verwendung in C/C++
- 8. Wie erkennen LLVM und seine Version über # define-Direktiven?
- 9. Warum funktioniert mein ifndef-Abschnitt nicht?
- 10. C#define basiert in einem anderen #define Fehler
- 11. Zweck von #ifndef FILENAME .... # endif in Header-Datei
- 12. Legacy-C++ verstehen #define
- 13. Warum werden Zeichenfolgen in C++ normalerweise mit '\ 0' beendet?
- 14. Welchen Effekt hat #define X X in C?
- 15. #define ein Tupel in C
- 16. if/endif "Unerreichbarer Code erkannt" in C#
- 17. richtige Reihenfolge #define Makro in C/C++
- 18. Seltsam Eclipse-C++ #define Verhalten
- 19. Zeiger in C mit einer #define
- 20. Ein #define in C mit drei Punkten
- 21. Obj-C, unter Verwendung von ifndef und target-Parameter, um nur Debug-Zeilen zu drucken?
- 22. Warum scheint mein C++ - Compiler in c
- 23. Beste Äquivalenz von #define in C++
- 24. Warum vorkompilierte Header (C/C++) verwenden?
- 25. Wie setze ich projektweit #define in C#
- 26. wenn {} in if: endif
- 27. Mit #define einem anderen Datei in C enthält ++/C
- 28. C++ Warum gibt es "unbekannten Typ", wenn Klassenkopf enthalten ist?
- 29. c Sprache - kann ich const uint32_t anstelle von #define verwenden
- 30. Ist Präprozessorausgabe eine gültige C/C++
Google "include guards" –