C ++ - Code-Dateierweiterung? .cc vs .cpp [geschlossen]

599

Ich habe gesehen, dass C ++ - Code sowohl als auch .ccals .cppDateien gespeichert wurde. Gibt es einen Unterschied zwischen den beiden?

Der Google Style Guide scheint dies vorzuschlagen .cc, bietet jedoch keine Erklärung.

Ich beschäftige mich hauptsächlich mit Programmen auf Linux-Systemen.

Jessica
quelle
85
Fazit Es spielt keine Rolle. Möglicher Ursprung cc = C mit Klassen, cpp = C plus plus
Lazer
6
Es ist wichtig, ++ zu klirren. Wenn Sie ihm eine C ++ - Headerdatei mit einem Namen geben, der mit .h endet, warnt Sie clang ++.
Allyourcode
4
Ein weiteres Werkzeug, das sich ein wenig interessiert, ist Emacs. Bei einer sauberen .emacs-Konfiguration aktiviert das Öffnen ("Finden" im emacs-Sprachgebrauch) einer .h-Datei den c-Modus, nicht den c ++ - Modus. Natürlich können Sie Emacs so konfigurieren, dass sie etwas anderes tun (wie bei allem in Emacs), aber mein Punkt ist, dass der C-Modus die Standardvorgabe ist.
Allyourcode
3
lintkümmert sich, .Cist C ++ und .cist C ohne jegliches Verständnis von .ccoder .cpp. Zumindest unter AIX 6.1.
Jesse Chisholm
5
Die Antwort "es spielt keine Rolle" hilft nicht wirklich. Die Frage ist absolut relevant. Das OP suchte nach einer soliden Konvention, an die es sich halten konnte. Eine bessere Antwort wäre: "Leider hat die C ++ - Community keine solide Konvention dazu". Es ist traurig, wenn Sie darüber nachdenken. Alle anderen gängigen Sprachen scheinen eine einzige, eindeutige Dateierweiterung zu haben. Ich würde mich an das halten, was ein wichtiges Projekt wie gcc verwendet. Sie benutzen.cc .
Lucio Paiva

Antworten:

703

Letztendlich spielt es keine Rolle, da C ++ - Compiler mit den Dateien in beiden Formaten umgehen können. Wenn es ein echtes Problem in Ihrem Team ist, werfen Sie eine Münze und fahren Sie mit der eigentlichen Arbeit fort.

JaredPar
quelle
89
Nun, das ist ein gültiger Punkt, aber er beantwortet nicht die Frage des Benutzers.
Vikrantt
319
cc ist schneller zu tippen
thang
50
Warum ist dies die akzeptierte Antwort? Ein neuerer Programmierer wird nicht wissen, dass es keine Rolle spielt, und er verdient eine direkte Antwort.
Robben_Ford_Fan_boy
14
Die Antwort ist für einen neugierigen und achtsamen Programmierer absolut nicht genug. Ich hätte gerne die Antwort auf dieser Seite mehr, da sie detailliertere Erklärungen enthält.
Novin Shahroudi
2
Wenn man bedenkt, dass der Compiler normalerweise nicht das einzige beteiligte Tool ist - fast immer gibt es "make" oder ein ähnliches Dienstprogramm, das sich darum kümmert, welche Erweiterungen Sie verwenden, um Regeln zu erstellen -, dann spricht diese Antwort den Kern wirklich nicht an Bedenken der Frage. Beachten Sie, dass es Variationen nach System und Toolchain gibt (einschließlich Ihrer bevorzugten Make-Regeln usw.), die sich auf die Entscheidung auswirken. Beispielsweise nimmt das standardmäßige rekursive Multi-Target-Build-System, das in einigen Entwicklungsplattformen der QNX 6-Serie enthalten ist, keine * .cpp-Dateien als C ++ - Sprachquellen auf. es will .cc
JoGusto
296

GNU GCC erkennt alle folgenden Dateien als C ++ - Dateien und verwendet die C ++ - Kompilierung, unabhängig davon, ob Sie sie über gcc oder g ++ aufrufen: .C , .cc, .cpp, .CPP, .c++, .cp, oder .cxx.

Beachten Sie, dass der .CFall in GCC .ceine C-Datei ist, während .Ces sich um eine C ++ - Datei handelt (wenn Sie den Compiler entscheiden lassen, was er kompiliert).

GCC unterstützt auch andere Suffixe, um auf eine spezielle Behandlung hinzuweisen. Beispielsweise wird eine .iiDatei als C ++ kompiliert, jedoch nicht vorverarbeitet (für separat vorverarbeiteten Code vorgesehen). Alle erkannten Suffixe finden Sie unter gcc.gnu.org

Clifford
quelle
5
"case matter in GCC" - Was ist mit Windows (da die Groß- und Kleinschreibung nicht berücksichtigt wird)?
Devesh Khandelwal
17
@ Devesh: Windows auch. Das Betriebssystem verhindert jedoch, dass zwei Dateien in einem Ordner nur nach Groß- und Kleinschreibung unterschieden werden.
Clifford
23
@ DeveshKhandelwal Aber es ist
fallerhaltend
229

Hervorragende Ratschläge zur Verwendung für das Makefile und andere Tools, unter Berücksichtigung von Nicht-Compiler-Tools bei der Entscheidung, welche Erweiterung verwendet werden soll, sind ein guter Ansatz, um eine Antwort zu finden, die für Sie funktioniert.

Ich wollte nur Folgendes hinzufügen, um bei einigen zu helfen .cc vs- .cppInformationen , die ich gefunden habe. Die folgenden Erweiterungen sind nach verschiedenen Umgebungen unterteilt (aus dem Buch "C ++ Primer Plus"):

Unix Anwendungen: .C, .cc,.cxx ,.c

GNU C ++ verwendet: .C, .cc, .cxx,.cpp ,.c++

Digital Mars verwendet: .cpp ,.cxx

Borland C ++ verwendet: .cpp

Watcom verwendet: .cpp

Microsoft Visual C ++ verwendet : .cpp,.cxx ,.cc

Metrowerks Codewarrior Verwendungen: .cpp, .cp, .cc,.cxx ,.c++

Die verschiedenen Umgebungen unterstützen verschiedene Erweiterungen. Auch ich wollte diese Frage beantworten und habe diesen Beitrag gefunden. Basierend auf diesem Beitrag denke ich, dass ich mit .hppund .cppzur Erleichterung der plattformübergreifenden / werkzeugübergreifenden Erkennung gehen könnte.

John S.
quelle
5
Diese Antwort ist am ehesten als andere, wenn es darum geht, die gestellte Frage zu beantworten, bei der es um jemanden geht, der nach einer soliden Konvention sucht, an die er sich halten kann. Andere Sprachen haben das, aber was die Dateierweiterung betrifft, scheint es C ++ zu fehlen.
Lucio Paiva
6
In welchem ​​Sinne verwendet Unix nicht .cpp?
Keith Thompson
vc ++ 6.0 unterstützt keine .cc-Datei.
Xus
@KeithThompson cehck Antwort des Benutzers user181548
Spyros Mourelatos
@SpyrosMourelatos Ja, aber es ist immer noch so, dass C ++ - Code auf Unix-ähnlichen Systemen sehr häufig .cppfür C ++ - Quelldateien verwendet wird. (In der zitierten Antwort wird darauf hingewiesen, dass "cpp" die Abkürzung für den C-Präprozessor ist.)
Keith Thompson
79

.cppist meines Wissens die empfohlene Erweiterung für C ++. Einige Leute empfehlen sogar die Verwendung .hppfür C ++ - Header, nur um sich von C zu unterscheiden.

Obwohl es dem Compiler egal ist, was Sie tun, ist es seine persönliche Präferenz.

Ryu
quelle
60
Ich habe mich entschieden, von .h auf .hpp für c ++ - Header umzusteigen. In erster Linie, weil andere Tools wie Editoren dies ebenfalls wissen müssen. Wenn Sie vorkompilierte Header mit gcc verwenden, wird standardmäßig C für .h-Dateien und C ++ für .hpp-Dateien verwendet, es sei denn, Sie verwenden beim Vorkompilieren die Option '-x c ++ - header' eine .h-Datei.
jdkoftinoff
5
@jd. Einverstanden. Es macht automatisierte Tools ein bisschen einfacher, wenn H / C-Dateien in Hpp / Cpp-Dateien umgewandelt werden.
Paul Nathan
4
g ++ erkennt .hpp nicht als C ++ - Header (für die Header-Vorkompilierung), aber .hh. Aus diesem Grund habe ich .cc / .hh über .cpp / .hpp verwendet, da es wirklich keinen wirklichen Unterschied gibt.
Tronic
3
@CharlesAddis - Ja, ich musste viel Code mit "abcd.H" (die c ++ - Schnittstelle) und "abcd.h" (die C-Schnittstelle) im selben Verzeichnis in "abcd.hpp" und "abcd.h" konvertieren "weil nur ein" svn co "oder das Entpacken auf eine Windows-Box oder Mac OS X-Box (mit Standard-Dateisystem) aufgrund der" doppelten Dateinamen "fehlschlagen würde
jdkoftinoff
37

Ich persönlich verwende die .ccErweiterung für Implementierungsdateien, .hhfür Header und .inlfür Inline / Vorlagen.

Wie gesagt, es ist hauptsächlich Geschmackssache.

Nach allem , was ich gesehen habe , .ccscheint es eher " Open Source-Projekte" zu sein " zu sein, wie es in einigen großartigen Open Source-Software-Codierungsstilen empfohlen wird. cppscheint eher fensterisch zu sein.

--- BEARBEITEN

Wie bereits erwähnt, ist dies "von dem, was ich gesehen habe" , es kann falsch sein. Es ist nur so, dass alle Windows-Projekte, an denen ich gearbeitet habe, verwendet .cppwerden und viele Open-Source-Projekte (die hauptsächlich auf Unix-Likes basieren) verwendet werden.cc .

Beispiele für Codierungsstile mit .cc:

Aurélien Vallée
quelle
1
Haben Sie einen Hinweis darauf? Ich habe noch nie OSS .cc vs Windows .cpp
Bobby
6
Visual Studio erstellt CPP-Dateien für C ++. Ich kenne die Geschichte dahinter nicht.
Natan Yellin
7
Der LLVM-Codierungsstandard scheint sich für .cpp / .h einzusetzen und das -*- C++ -*-Tag in die Header llvm.org/docs/CodingStandards.html einzufügen . Mozilla Coding Style schlägt vor .cpp / .h developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/… ; KDE scheint .cpp / .h zu quickgit.kde.org
sastanin
19

Andere verwendete Dateierweiterungen sind .cxxund .C(Großbuchstabe C). Ich glaube, Bjarne Stroustrup hat .Cursprünglich verwendet. .cppist der Name des C-Präprozessors, daher ist es bedauerlich, dass er auch für C ++ verwendet wurde.

Benutzer181548
quelle
13

Die andere Option ist, .cxxwo das xPlus um 45 ° gedreht werden soll.

Windows, Mac und Linux unterstützen alle, .c++also sollten wir das einfach verwenden.

FigBug
quelle
12

Mehrere Leute sagen .cc, steht für nichts? Es könnte. C ++ begann sein Leben als "C mit Klassen".

Stimmt das .cc und .cppsind auch Befehlsnamen auf den meisten Unix-Systemen (c-Compiler bzw. c-Präprozessor).

Ich benutze .cppausschließlich, aber ich habe unter Windows gestartet. .ccist eher eine Unix-Konvention, obwohl ich sie selbst dort immer weniger sehe. GNU make hat Regeln für das .cpp, was wahrscheinlich bevorzugt wird. Es funktioniert standardmäßig sowohl unter Windows als auch unter allem anderen. Andererseits verwendet modernes C ++ überhaupt keine Erweiterung für Header, das gefällt mir wirklich nicht. Alle meine Projekte werden .hfür Header-Dateien verwendet und unterstützen sowohl C als auch C ++ so weit wie möglich über extern "C"und testen __cplusplus.

Ben Voigt
quelle
2
sollte das dann nicht .cwc sein? :)
Joshua
Bevor viele Compiler Namespaces unterstützten, verwendeten sie auch die Erweiterung .h für Standardheader. In der Regel stellen Compiler veraltete .h-Versionen bereit, mit denen die Bibliothek in den globalen Namespace eingefügt wird. Dies ermöglicht die Unterstützung von Legacy-Code. Ich habe irgendwo einmal gelesen, dass der Grund dafür, dass sie keine .h-Erweiterungen haben, darin besteht, dass der Standard zulässt, dass sie keine Dateien sind, sondern im Wesentlichen "eingebaut". Dies kann jedoch apokryphisch sein.
Clifford
11

Befolgen Sie einfach die Konvention, für die das Projekt / Team verwendet wird.

Ben S.
quelle
11

Ich persönlich habe noch nie .ccin einem Projekt gesehen, an dem ich gearbeitet habe, aber technisch gesehen ist es dem Compiler egal.

Wen es interessiert, sind die Entwickler, die an Ihrer Quelle arbeiten. Meine Faustregel lautet also, mit dem zu arbeiten, mit dem Ihr Team vertraut ist. Wenn Ihr "Team" die Open-Source-Community ist, wählen Sie etwas sehr Gemeinsames, von dem .cppder Favorit zu sein scheint.

Toji
quelle
Einige bekannte Projekte wie github.com/google/googletest verwenden .ccals Dateierweiterung für C ++ - Implementierungsdateien
Vertexwahn
10

Wie bei den meisten Stilkonventionen sind nur zwei Dinge wichtig:

  1. Seien Sie konsequent in dem, was Sie verwenden, wo immer dies möglich ist.
  2. Entwerfen Sie nichts, was von einer bestimmten Auswahl abhängt.

Diese scheinen sich zu widersprechen, aber sie haben jeweils aus ihren eigenen Gründen einen Wert.

Alan
quelle
8

.Cund .ccscheinen Standard für die (wenigen) Unix-orientierten C ++ - Programme zu sein, die ich gesehen habe. Ich habe .cppmich immer selbst benutzt, da ich nur wirklich unter Windows arbeite und das dort seit wie immer der Standard ist.

Ich empfehle .cpppersönlich, weil ... es für "C Plus Plus" steht. Es ist natürlich von entscheidender Bedeutung, dass Dateierweiterungen Akronyme sind, aber sollte sich diese Begründung als unzureichend zwingend erweisen, sind andere wichtige Dinge die Nichtverwendung der Umschalttaste (die ausschließt .Cund .c++) und die Vermeidung von Metazeichen für reguläre Ausdrücke, wenn möglich (welche ausschließen .c++- das kann man leider .natürlich nicht wirklich vermeiden .).

Dies schließt nicht aus .cc, und obwohl es nicht wirklich für irgendetwas steht (oder?), Ist es wahrscheinlich eine gute Wahl für Linux-orientierten Code.

Bitte lösche mich
quelle
2
"Cpp" könnte aber auch für "C-Präprozessor" stehen. Tatsächlich ist das Programm "cpp" auf Ihrem System höchstwahrscheinlich der C-Präprozessor ...
Jesper
8

Ich habe .C und .h für Quelle bzw. Header verwendet. Eine schöne Sache bei dieser Auswahl ist, dass es in der Befehlszeile einfach ist *.[Ch], alle Codedateien auszuwählen. Mit Hilfe .Ckönnte ein Problem auf Groß- und Kleinschreibung Dateisystemen sein, aber wenn Sie haben foo.cund foo.Cim gleichen Verzeichnis, Sie verdienen , was bekommt man sowieso :)

KeithB
quelle
8

Die Erweiterung .cc ist erforderlich, um implizite Regeln in Makefiles zu verwenden. Schauen Sie sich diese Links an, um ein besseres Verständnis der Makefiles zu erhalten, aber schauen Sie sich hauptsächlich die zweite an, da sie die Nützlichkeit der Erweiterung .cc deutlich macht:

ftp://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_2.html

https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html

Ich habe gerade davon erfahren.

Kyle
quelle
Wieder sind sie nur .cppDateien. Keine Sorge ! :-)
Tom Taylor
1
Es heißt "Wir empfehlen Ihnen, das Suffix '.cc' für C ++ - Quelldateien anstelle von '.C' zu verwenden." Ich vermute, das ist nur eine schlechte Formulierung. Die Verwendung .Ckann auf Systemen mit Dateisystemen ohne Berücksichtigung der Groß- und Kleinschreibung problematisch sein. Ich glaube nicht , dass es irgendwelche besonderen Vorteil, soweit makebetroffen ist, bei der Verwendung .ccüber .cpp, zum Beispiel. Makefiles funktionieren einwandfrei .cppfür C ++ - Quelldateien.
Keith Thompson
7

Es spielt keine Rolle, welche dieser Erweiterungen Sie verwenden würden. Wählen Sie aus, was Ihnen besser gefällt, und stimmen Sie einfach mit der Benennung überein. Die einzige Ausnahme, die mir bei dieser Namenskonvention bekannt ist, ist, dass ich sie nicht machen konnteWinDDK Dateien WDKkompilieren (oder jetzt?) .cc. Unter Linux ist das allerdings kaum ein Problem.

Dmitry
quelle
6

Ich starte ein neues C ++ - Projekt und suche nach dem neuesten C ++ - Stil. Ich bin hier in Bezug auf die Benennung von Dateien gelandet und dachte, ich würde mitteilen, wie ich zu meiner Wahl gekommen bin. Hier geht:

Stroustrup sieht dies eher als geschäftliche als als technische Überlegung an .

Lassen Sie uns nach seinem Rat überprüfen, was die Toolchains erwarten.

Unter UNIX / Linux können Sie die folgenden Standard-GNU-Make-Regeln so interpretieren, dass sie das .cc-Dateinamensuffix bevorzugen, da .cpp- und .C-Regeln nur Aliase sind:

$ make -p | egrep COMPILE[^=]+=
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
COMPILE.cpp = $(COMPILE.cc)
COMPILE.C = $(COMPILE.cc)

(Hinweis: Es gibt keinen Standardalias für COMPILE.cxx.)

Wenn Sie also auf UNIX / Linux abzielen, sind sowohl .cc als auch .cpp sehr gute Optionen.

Wenn Sie auf Windows abzielen, suchen Sie nach Problemen mit .C, da das Dateisystem nicht zwischen Groß- und Kleinschreibung unterscheidet. Und es kann wichtig sein, dass Sie das beachten Visual Studio das Suffix .cpp bevorzugt

Beachten Sie beim Targeting von macOS, dass Xcode .cpp / .hpp bevorzugt (nur in Xcode 10.1 aktiviert). Sie können die Header-Vorlage jederzeit ändern, um .h zu verwenden.

Für das, was es wert ist, können Sie Ihre Entscheidung auch auf die Codebasen stützen, die Sie mögen. Google verwendet .cc und LLVM libc ++ verwendet beispielsweise .cpp.

Was ist mit Header-Dateien? Sie werden im Kontext einer C- oder C ++ - Datei kompiliert, sodass kein Compiler oder Build-System zwischen .h und .hpp unterscheiden muss. Das Hervorheben der Syntax und das automatische Einrücken durch Ihren Editor / Ihre IDE können jedoch ein Problem sein. Dies wird jedoch behoben, indem alle .h-Dateien einem C ++ - Modus zugeordnet werden. Als Beispiel lädt meine emacs-Konfiguration unter Linux alle .h-Dateien im C ++ - Modus und bearbeitet C-Header einwandfrei. Darüber hinaus können Sie beim Mischen von C und C ++ diesen Rat befolgen .

Mein persönliches Fazit : .cpp / .h ist der Weg des geringsten Widerstands.

Armorix
quelle
3

Wie andere vor mir geschrieben haben, wird es am Ende von Ihrem Projekt / Team / Unternehmen verwendet.

Persönlich verwende ich keine ccErweiterung, ich versuche, die Anzahl der Erweiterungen zu verringern und nicht zu erhöhen, es sei denn, es gibt einen eindeutigen Wert (meiner Meinung nach).

Für was es wert ist, ist das, was ich benutze :

c - Nur reiner C-Code, keine Klassen oder Strukturen mit Methoden.

cpp - C ++ - Code

hpp- Nur Header-Code. Implementierungen befinden sich in den Headern (wie Vorlagenklassen).

h- Header-Dateien für C / C ++. Ich bin damit einverstanden, dass eine andere Unterscheidung getroffen werden kann, aber während ich schrieb, versuche ich der Einfachheit halber, die Anzahl der Erweiterungen zu verringern. Zumindest aus den C ++ - Projekten, in denen ich gearbeitet habe, sind hDateien für Pure-C seltener, daher wollte ich keine weitere Erweiterung hinzufügen.

TCS
quelle