Frage

Ist 'überflüssig sind Wachen notwendig in CodeGear RAD Studio 2009? Ist der Compiler intelligent genug, um damit auf seine eigenen zu tun?

Zum Beispiel könnte ich habe folgende ‚umfasst Wache‘ in foo.h:

#ifndef fooH
#define fooH
// ... declaration here
#endif

und die folgende 'überflüssig sind guard' in use_foo.h:

#ifndef fooH
    #include "foo.h"
#endif

Darüber hinaus, wenn der Compiler nicht intelligent genug ist, sind "überflüssig sind Wachen necesarry, wenn sie in einer Quelldatei enthalten sind. z.B. use_foo.cpp. ?

War es hilfreich?

Lösung

Der Teil des Codes Sie markiert als „redundant sind guard“ ist nicht notwendig, aber es ist ein möglich Optimierung.

Im Fall von C ++ Builder gibt es Logik Kopfschutz zu erkennen, sodass es nicht erforderlich sein sollte.

Im allgemeinen Fall wird die Vorverarbeitung Pass ist in der Regel ziemlich schnell sowieso, so ist es unwahrscheinlich, dass diese Optimierung Sie viel sowieso kaufen würde.

Andere Tipps

Diese redundante umfassen Wachen sollen die Funktionalität der vorgeschlagenen #pragma once Richtlinie emulieren: wenn einige Header-Datei bereits aufgenommen wurde, dann wird der Präprozessor nicht einmal zu lokalisieren versuchen, öffnen und analysieren es nicht mehr (wie es haben würde mit die „normale“ umfasst guard-Technik). In vielen Fällen ist diese Marken gehören Umgang mit Dateien wesentlich effizienter (beschleunigt Kompilierung).

Dieser Ansatz ist natürlich eine High-Wartung ein. Man muss sicherstellen, dass die Schreibweise des Schutzsymbols ist genau das gleiche in der Header-Datei als auch außerhalb

Die "redundant sind Wache", wie Sie es nennen, beschleunigt Kompilierung.

Ohne die redundante Wache, wird der Compiler die gesamte foo.h Datei iterieren, für einige Code suchen, der außerhalb des #ifndef Block sein könnte. Wenn es eine lange Datei ist, und dies ist vielen Orten geschehen, könnte der Compiler viel Zeit verschwenden. Aber mit der redundanten Wache, kann er die gesamte #include Anweisung überspringt und nicht einmal die Datei erneut öffnen.

Natürlich würden Sie experimentieren und die tatsächliche Höhe der Zeit vom Compiler Iterieren durch foo.h und nicht wirklich kompiliert etwas verschwendet zu sehen; und vielleicht moderne Compiler tatsächlich aussehen für dieses Muster und automatisch wissen, nicht zu stören, die Datei überhaupt zu öffnen, weiß ich nicht.

(Beginnen bearbeitet von 280Z28)

Die folgende Header-Struktur wird durch mindestens GCC und MSVC anerkannt. dieses Muster unter Verwendung negiert praktisch alle Vorteile, die Sie mit Wachen in den darunter Dateien gewinnen konnte. Beachten Sie, dass Kommentare werden ignoriert, wenn der Compiler die Struktur untersucht.

// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED

// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#   pragma once
#endif

// header text goes here.

#endif

(End edit)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top