Ist es eine gute Praxis, C ++ - Headerdateien ohne Erweiterung zu haben?

9

Ich habe einen Streit mit einem meiner Kollegen bezüglich der zu befolgenden C ++ - Richtlinien.

Derzeit gestaltet er alle seine Bibliotheken folgendermaßen:

  • Er verwendet in seinen Dateinamen uneinheitlich Groß- und Kleinbuchstaben
  • Einige seiner Header haben keine Erweiterung

Ich glaube, dass keine Erweiterung für C ++ - Standarddateien reserviert ist und dass die Verwendung von Großbuchstaben fehleranfällig ist (insbesondere, wenn Sie mit Code arbeiten, der sowohl unter Windows als auch unter Linux funktionieren soll).

Sein Punkt ist, dass er QtKonventionen befolgt (auch für Code, der kein Qt verwendet) und immer wieder sagt: "Wenn Qt es so macht, kann es nicht schlecht sein."

Jetzt versuche ich offen zu bleiben, aber ich fühle mich wirklich schlecht, wenn ich an / mit seinen Bibliotheken arbeiten muss. Gibt es diesbezüglich ein gemeinsames Regelwerk? Erzählt der Standard etwas darüber?

Vielen Dank.

ereOn
quelle
3
#define signal……… ("Wenn Qt es so macht, kann es nicht schlecht sein.") - Ich kann nicht sagen, dass ich persönlich mit all ihren Designentscheidungen einverstanden bin.
Justin
@ Justin: Ich auch nicht. Ich habe nichts dagegen Qt. Ich denke sogar, dass es eine erstaunliche Bibliothek ist, aber einige ihrer Designentscheidungen fühlen sich für mich wirklich falsch an.
Uhr
1
@Justin Ich habe Makros gesehen, die mit _populärem, weit verbreitetem Code beginnen, aber es ist definitiv gegen den Standard.
Luchian Grigore
1
Aber hier ist ein wirklicher Grund, Header ohne Erweiterungen zu vermeiden: Meine primäre IDE und mein Texteditor erkennen sie nicht automatisch. Ich benutze nur *.hppfür einen C ++ - Header und alle meine Tools "bekommen es".
Justin
5
Qt verwendet diese Konvention genau deshalb , weil intelligente Programmierer dies nicht tun. Dies bedeutet, dass Ihre Header nicht mit neuen Qt-Headern in Konflikt geraten.
MSalters

Antworten:

16

Die Erweiterung (oder das Fehlen von) wird, soweit ich weiß, keine Probleme verursachen. Ich würde sagen, dass das Löschen der Erweiterung insgesamt unpraktisch ist, da es schwierig ist, Header-Dateien zu durchsuchen (zum Beispiel mit den Platzhaltern * .h und * .hpp) und es schwieriger macht, den Inhalt einer Datei zu identifizieren (zum Beispiel wenn Ihr Editor verlässt sich auf die Erweiterung, um den richtigen Syntaxhervorhebungsmodus auszuwählen.

Aus Code-Sicht macht es keinen großen Unterschied, auch das Gehäuse ist nicht problematisch, solange Sie überall einen konsistenten Fall verwenden und sich nicht nur auf Fallunterschiede verlassen, um Dateien zu unterscheiden. Aus praktischen Gründen ist es einfacher, sich an Kleinbuchstaben zu halten und eine Erweiterung (entweder .h oder .hpp) zu haben.

Wichtiger ist jedoch, dass Sie eine Konvention für Ihr gesamtes Entwicklungsteam auswählen und diese einhalten . Es ist weitaus schlimmer, nachschlagen zu müssen, wie eine Datei eingeschlossen, benannt und welche Erweiterung verwendet wird, wenn Sie etwas einschließen möchten - all dies sollte "erraten" sein, wenn Sie wissen, was Sie verwenden möchten.

Adam Bowen
quelle
Es ist keine schlechte Idee, eine Konvention auszuwählen und daran festzuhalten, aber was ist, wenn die bestehende Konvention verbessert werden kann? In diesem Fall ist es vielleicht eine gute Idee, den Kurs zu ändern.
Kotlinski
@kotlinski Dies ist einer der Fälle, in denen Sie nichts tun können, um die Situation zu verbessern, da alles, was Sie auswählen, bevorzugt wird. Eine Erweiterung zu haben, würde ich sagen, ist besser als keine, da das Betriebssystem (Lesen, Windows) anhand der Erweiterung bestimmen kann, mit welchem ​​Programm die Datei geöffnet werden soll.
Paul
@ PaulManta: Aber argumentierst du hier nicht gegen dich selbst? Zunächst sagen Sie, dass es keine Möglichkeit gibt, etwas zu verbessern. Dann sagen Sie, eine Erweiterung zu haben ist besser als nicht. Das ist eine Art defätistische Haltung, die besagt, dass keine Änderung möglich ist.
Kotlinski
@kotlinski Im Allgemeinen hängt das davon ab, mit wie viel altem Code Sie arbeiten würden, ob es sinnvoll wäre, alles auf die neue Konvention umzustellen, und wie sich das Mischen von Konventionen auswirken würde. In diesem Fall stimme ich Paul Manta zu - es ist meistens eine persönliche Präferenz, wobei eine Erweiterung von den meisten aus praktischen Gründen bevorzugt wird.
Adam Bowen
1
@kotlinski Es gibt keine Möglichkeit, etwas zu verbessern, aber es gibt Möglichkeiten, die Dinge noch schlimmer zu machen. Diese Diskussion ist genauso sinnlos wie die Diskussion zwischen Leerzeichen und Tabulatoren. Wählen Sie einfach eine Konvention und machen Sie etwas Nützliches.
Paul
6

Es gibt keine Regel (im Standard), dass nur Standard-Header-Dateien ohne Erweiterung sein dürfen. Der Dateiname kann so ziemlich alles sein, was Sie wollen. Allgemeine bewährte Verfahren legen jedoch Folgendes nahe:

  1. Keine Dateien dürfen jemals ohne Erweiterung sein, und

  2. Unterschiedliche Dateitypen haben unterschiedliche Erweiterungen. Insbesondere verwenden C ++ - Header eine andere Erweiterung ( .hppoder .hh) als Header, die für einen C-Compiler akzeptabel sind.

(Leider wird die zweite Regel häufig verletzt, und man sieht häufig C ++ - Header-Dateien mit .h. Aus persönlicher Erfahrung kann ich versichern, dass dies später zu Wartungsproblemen führen wird, aber dies ist gängige Praxis.)

In Bezug auf den Fall ist äußerste Vorsicht geboten, da bei Dateinamen in einigen Systemen zwischen Groß- und Kleinschreibung unterschieden wird und in anderen nicht. Ich habe zwei verschiedene Regeln gesehen, die funktionieren: Entweder alles in Kleinbuchstaben im Dateinamen oder der Dateiname folgt genau den gleichen Regeln in Bezug auf die Groß- und Kleinschreibung wie für Symbole in C ++.

In beiden Fällen legen Sie im Konsens Regeln für das Projekt fest, die von allen befolgt werden.


quelle
1
Ich bin total mit James in diesem Fall. Es ist ein Albtraum, wenn Tools für die beiden verschiedenen Arten von Header-Dateien ordnungsgemäß funktionieren, wenn sie dieselbe Erweiterung haben.
@ TomTanner Und es ist noch schlimmer, wenn Sie Dateien ohne Erweiterungen haben. Ich habe hauptsächlich in einer Unix-Umgebung gearbeitet und es hat mich immer frustriert (und Probleme verursacht), dass ausführbare Dateien keine Erweiterung haben.
6
If Qt does it that way, then it can't be bad.

Ja. Ja, das kann es wirklich. Ihr Bibliotheksdesign lautet "Wir wollen unbedingt Java sein". Es ist ein totales Durcheinander. Die Standardbibliothek ist viel besser.

Grundsätzlich ist es auch ein logischer Irrtum. Das Design von Qt ist nur dann eine Nachahmung wert, wenn Sie logische Argumente dafür liefern können, warum es gut ist. Es ist nicht gut, nur weil es Qt ist.

DeadMG
quelle
Es ist ein empirisches Argument. Es ist ein großes Softwareprodukt, das von vielen Menschen verwendet wird. Wenn diese Wahl der Namenskonvention erhebliche Probleme verursachen würde, wäre sie bekannt und wahrscheinlich inzwischen geändert. Da dies nicht der Fall ist, kann es nicht schlecht sein. Das heißt aber nicht, dass es die beste Lösung ist.
H. Rittich
0

Wie ich weiß, wären seit dem Standard von 1998 nur Standard-Bibliotheksheader ohne die .h. Daher werden nicht standardmäßige C ++ - Headerdateien herkömmlicherweise immer noch mit .h geschrieben. Aber denken Sie daran, dass es sich um eine Konvention handelt. Sie können keine Erweiterung oder sogar .txt-Erweiterung verwenden. Es ist, als würden Sie Ihre Klassen mit Kleinbuchstaben schreiben. Es funktioniert immer noch, aber es ist nicht die Konvention.

Mario Corchero
quelle
3
Übrigens "Wenn Qt es so macht, kann es nicht schlecht sein." Es ist ein wirklich schlechtes Argument ...
2
Der Standard hat nichts darüber zu sagen, wie benutzerdefinierte Header Namen sein sollen. Es werden nur die Namen der Standardheader angegeben.
Mike Seymour
0

Dies sind Konventionen, keine Regeln. Es gibt keine Einschränkung, Konventionen einzuhalten, aber Konventionen erleichtern das Leben, wenn Sie als Referenz vorbeikommen.

Gemäß den Erweiterungen (.h, .hpp) müssen die in c ++ enthaltenen Dateien keine Erweiterungen haben. Sie müssen die Erweiterungen verwenden, wenn Sie Header von anderen als c ++ verwenden, z. B. c-Bibliotheken oder Boost-Bibliotheken.


quelle