[c++] Best Practices für die Verwendung von C ++ - Headerdateien



Answers

  1. Ich habe gehört, dass Kommentare vor dem include guard dazu führen können, dass einige Compiler eine Optimierung verpassen. Wenn der Wächter die allererste Sache ist, kann der Compiler das Idiom erkennen und nicht einmal den Header für nachfolgende Includes öffnen. In meinem eigenen Code gehen normalerweise Kommentare dem Include-Wächter voraus. Ich habe mich nie darum gekümmert zu prüfen, ob dies Auswirkungen hat oder nicht. Und ich werde wahrscheinlich nie (aber wenn jemand anderes, würde ich an den Ergebnissen interessiert sein).

  2. Natürlich sollten Kopfzeilen Namespaces enthalten - sonst könnte nichts Nützliches jemals in einem Namespace sein. Wie Sie bereits erwähnt haben, sollten Header jedoch keine Namespaces (in Ermangelung eines besseren Wortes) in eine Kompilierungseinheit mit einer using -Direktive "importieren".

Question

Ich habe folgende Zweifel an der Verwendung der Header-Dateien.

1 - Schließen Sie die Wachen ein, die nach den Kommentaren platzieren

/* Copyright Note and licence information (multiple lines) */
#ifndef FOO_H
#define FOO_H
// Header file contents
#endif

Herb Sutter sagt in seinem Buch "C ++ Coding Standards", dass Code wie oben problematisch ist. Er sagt, die "#ifndef" -Anweisungen sollten in der ersten Zeile der Header-Datei erscheinen. Ich habe das nicht als überzeugend empfunden. Wird dies von euch / gals in Header-Dateien gefolgt?

2 - Verwenden von Namespaces in Headerdateien

#ifndef FOO_H
#define FOO_H
namespace FooNameSpace{
    // Header file contents
}
#endif

Verwendet der obige Code die korrekte Vorgehensweise? Ich meine, verwenden Sie Namespaces in Header-Dateien? Ich weiß, warum es sinnlos ist, einen Namespace in eine Headerdatei zu importieren, aber was ist mit einer Deklaration wie oben?

Wenn das obige die richtige Methode ist, wie machst du die " forward declaration " einer Klasse, die sich in einem anderen Namensraum befindet? Ist es so?

#ifndef FOO_H
#define FOO_H
namespace AnotherNameSpace{
    class AnotherFoo; // forward declaration
}

namespace FooNameSpace{
    // Use AnotherFoo here
}
#endif

Die " Forward-Deklaration " ist die einzige Methode, um " zyklische Abhängigkeit " zu vermeiden, richtig?




1) Da Kommentare nichts tun, bezweifle ich, dass es wichtig ist. Technisch, #include kopieren und einfügen, so dass die Kommentare außerhalb der Header-Wächter kann mehr Arbeit für den Präprozessor bedeuten. Ich weiß nicht, ob die meisten Compiler schlau genug sind, um dies zu optimieren (dh, wenn sie Kommentare vor dem Präprozessor-Schritt entfernen), aber Sie würden wahrscheinlich nicht bemerken, bis Sie Zehntausende von Header-Dateien erreicht haben.

2) Das ist richtig. Wenn Sie eine Klasse in einen Namespace einfügen wollen und diese Klasse in einer Header-Datei deklariert werden soll, dann sollte sie innerhalb des Namespace deklariert werden, der in der Header-Datei enthalten sein sollte. Und ja, genau so geht es vorwärts zu deklarieren. Und ja, es ist das wichtigste Werkzeug, um zyklische Abhängigkeiten zu vermeiden (Sie könnten auch Ihr Design ändern, aber es ist prinzipiell nichts falsch an der Zyklizität, vorausgesetzt, die beiden Klassen beziehen sich nur auf Referenz oder Zeiger und rufen keine Methoden auf) .




Links