Estensione di codice C ++? .cc vs .cpp [chiuso]


599

Ho visto il codice C ++ salvato sia come .cce .cppfile. C'è una differenza tra i due?

La guida di stile di Google sembra suggerire .cc, ma non fornisce alcuna spiegazione.

Mi occupo principalmente di programmi su sistemi Linux.


85
Conclusione Non importa. Possibile origine cc = C con classi, cpp = C plus plus
Lazer,

6
È importante clangare ++. Quando gli dai un file di intestazione C ++ con un nome che termina in .h, clang ++ ti avverte.
codice alleato

4
Un altro strumento che si preoccupa un po 'è emacs. Con una configurazione pulita .emacs, aprendo ("trovando" in emacs parlance) un file .h attiva la modalità c, non la modalità c ++. Ovviamente, puoi configurare emacs per fare qualcos'altro (come per qualsiasi cosa in emacs), ma il mio punto è che c-mode è il valore predefinito.
codice alleato

3
lintse ne frega, .Cè C ++ ed .cè C senza alcuna comprensione di .cco .cpp. Almeno su AIX 6.1.
Jesse Chisholm,

5
Rispondere "non importa" non aiuta davvero. La domanda è totalmente pertinente. L'OP stava cercando una solida convenzione a cui attenersi. Una risposta migliore sarebbe: "Sfortunatamente, la comunità C ++ non ha una solida convenzione su questo". È triste, se ci pensi. Tutte le altre lingue popolari sembrano avere un'estensione di file unica e unica. Vorrei attenermi a ciò che utilizza un progetto importante, come gcc. Usano.cc .
Lucio Paiva,

Risposte:


702

Alla fine della giornata non importa perché i compilatori C ++ possono gestire i file in entrambi i formati. Se è un vero problema all'interno della tua squadra, lancia una moneta e passa al lavoro effettivo.


89
Bene, questo è un punto valido, ma non risponde alla domanda dell'utente.
vikrantt,

319
cc è più veloce a digitare
thang

50
Perché questa è la risposta accettata? Un nuovo programmatore non saprà che non ha importanza e merita una risposta semplice.
Robben_Ford_Fan_boy,

14
La risposta non è assolutamente sufficiente per un programmatore curioso e attento. Mi piacerebbe di più la risposta su questa pagina poiché contiene spiegazioni più dettagliate.
Novin Shahroudi,

2
Se si considera che il compilatore non è in genere l'unico strumento coinvolto - quasi sempre, c'è "make" o un'utilità simile che si prenderà cura delle estensioni che si utilizzano, per la corrispondenza delle regole di costruzione - quindi questa risposta in realtà non riguarda il core preoccupazioni della domanda. Nota che ci sono variazioni per sistema e per toolchain (incluse le tue regole di creazione preferite, ecc.) Che avranno un impatto sulla decisione. Ad esempio, il sistema di compilazione multi-target ricorsivo predefinito, alcune delle piattaforme di sviluppo della serie QNX 6 non raccolgono i file * .cpp come fonti del linguaggio C ++; vuole .cc
JoGusto

296

GNU GCC riconosce tutti i seguenti file come C ++, e userà C ++ compilazione indipendentemente dal fatto che si richiama tramite gcc o g ++: .C, .cc, .cpp, .CPP, .c++, .cp, o .cxx.

Nota: il .Ccaso - importa in GCC, .cè un file C mentre .Cè un file C ++ (se lasci che il compilatore decida che cosa sta compilando).

GCC supporta anche altri suffissi per indicare una gestione speciale, ad esempio un .iifile verrà compilato come C ++, ma non pre-elaborato (destinato al codice pre-elaborato separatamente). Tutti i suffissi riconosciuti sono dettagliati su gcc.gnu.org


5
"case matter in GCC" - Che dire di Windows (poiché non fa distinzione tra maiuscole e minuscole)?
Devesh Khandelwal,

17
@Devesh: anche Windows. Ma il sistema operativo ti impedirà di avere due file in una cartella distinti solo per caso.
Clifford,

23
@DeveshKhandelwal Ma preserva il caso
Yatharth Agarwal

229

Ottimi consigli su quale utilizzare per il makefile e altri strumenti, considerando gli strumenti non di compilazione mentre si decide su quale estensione utilizzare è un ottimo approccio per aiutarti a trovare una risposta che funzioni per te.

Volevo solo aggiungere quanto segue per aiutare con alcune informazioni .ccvs .cppche ho trovato. Le seguenti sono estensioni suddivise per ambienti diversi (dal libro "C ++ Primer Plus"):

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

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

Usi Digital Mars: .cpp,.cxx

Borland C ++ utilizza: .cpp

Watcom utilizza: .cpp

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

Metrowerks CodeWarrior usi: .cpp, .cp, .cc, .cxx,.c++

I diversi ambienti supportano estensioni diverse. Anch'io stavo cercando di rispondere a questa domanda e ho trovato questo post. Sulla base di questo post penso che potrei andare con .hppe .cppper facilitare il riconoscimento multipiattaforma / cross-tool.


5
Questa risposta è la più vicina di altre nel cercare davvero di affrontare la domanda presentata, che riguarda qualcuno che cerca una solida convenzione a cui attenersi. Altre lingue lo hanno, ma per quanto riguarda l'estensione dei file, sembra che manchi C ++.
Lucio Paiva,

6
In che senso non usa Unix .cpp?
Keith Thompson,

vc ++ 6.0 non supporta il file .cc.
xus

@KeithThompson cehck risposta dell'utente user181548
Spyros Mourelatos

@SpyrosMourelatos Sì, ma è ancora vero che il codice C ++ su sistemi simili a Unix utilizza molto comunemente .cppper i file sorgente C ++. (La risposta citata osserva che "cpp" è l'abbreviazione del preprocessore C.)
Keith Thompson

79

.cppè l'estensione consigliata per C ++ per quanto ne so. Alcune persone raccomandano persino di utilizzare le .hppintestazioni C ++, solo per differenziarsi da C.

Sebbene il compilatore non si preoccupi di ciò che fai, è una preferenza personale.


60
Ho deciso di passare dall'uso di .h all'utilizzo di .hpp per le intestazioni c ++; principalmente perché anche altri strumenti come gli editor devono sapere - Inoltre, quando si usano le intestazioni precompilate con gcc, per impostazione predefinita si usa C per i file .h e C ++ per i file .hpp, a meno che non si usi l'opzione '-x c ++ - header' durante la precompilazione un file .h.
jdkoftinoff,

5
@jd. Concordato. Rende gli strumenti automatici un po 'più semplici se i file h / c si trasformano in file hpp / cpp.
Paul Nathan,

4
g ++ non riconosce .hpp come intestazione C ++ (per la precompilazione delle intestazioni) ma lo fa .hh. Per questo motivo ho finito per usare .cc / .hh su .cpp / .hpp in quanto non c'è davvero alcuna differenza.
Tronic,


3
@CharlesAddis - Sì, ho dovuto convertire un sacco di codice con "abcd.H" (interfaccia c ++) e "abcd.h" (interfaccia C) nella stessa directory in "abcd.hpp" e "abcd.h "perché fare semplicemente" svn co "o decomprimerlo in una finestra di Windows o Mac OS X (con un filesystem predefinito) fallirebbe a causa dei" nomi di file duplicati "
jdkoftinoff

37

Uso personalmente l' .ccestensione per i file di implementazione, .hhper le intestazioni e .inlper inline / template.

Come detto prima, è principalmente una questione di gusti.

Da quello che ho visto , .ccsembra essere più " orientato ai progetti open source ", come è consigliato in alcuni grandi stili di codifica software open source, mentre. cppsembra essere più Windowish.

--- MODIFICARE

Come accennato, questo è "da quello che ho visto" , potrebbe essere sbagliato. È solo che vengono utilizzati tutti i progetti Windows su cui ho lavorato .cppe molti progetti open source (che sono principalmente su mi piace unix) .cc.

Esempi di stili di codifica utilizzando .cc:


1
hai riferimenti a questo? Non ho mai visto OSS .cc vs Windows .cpp
bobby

6
Visual Studio crea file .cpp per C ++. Non conosco la storia dietro di esso.
Natan Yellin,

7
LLVM Coding Standard sembra difendere .cpp / .h e inserire -*- C++ -*-tag nelle intestazioni llvm.org/docs/CodingStandards.html ; Mozilla Coding Style suggerisce .cpp / .h developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/… ; KDE sembra usare .cpp / .h troppo quickgit.kde.org
sastanin,

19

Altre estensioni di file utilizzate includono .cxxe .C(maiuscola C). Credo che Bjarne Stroustrup usato .Coriginariamente. .cppè il nome del preprocessore C, quindi è un peccato che sia stato usato anche per C ++.


13

L'altra opzione è .cxxdove xsi suppone che sia un plus ruotato di 45 °.

Windows, Mac e Linux supportano tutti .c++quindi dovremmo semplicemente usarlo.


12

Diverse persone dicono .ccche non rappresenta nulla? Potrebbe. Il C ++ ha iniziato la sua vita come "C con classi".

È vero .cce .cppsono anche nomi di comandi sulla maggior parte dei sistemi Unix (rispettivamente compilatore c e preprocessore c).

Uso .cppesclusivamente, ma ho iniziato su Windows. .ccè più una convenzione Unix, anche se la vedo sempre meno lì. GNU make ha delle regole per .cppcui probabilmente è preferito, funzionerà di default sia su Windows che su tutto il resto. D'altro canto, il moderno C ++ non usa alcuna estensione per le intestazioni, non mi piace proprio. Tutti i miei progetti utilizzano .hfile di intestazione e supportano il più possibile sia C che C ++ tramite extern "C"e test __cplusplus.


2
non dovrebbe essere .cwc allora? :)
Giosuè,

Prima che molti compilatori supportassero gli spazi dei nomi, usavano anche l'estensione .h per le intestazioni standard. Comunemente, i compilatori forniscono versioni .h obsolete che posizionano la libreria nello spazio dei nomi globale. Ciò consente il supporto del codice legacy. Ho letto da qualche parte che il motivo per cui non hanno estensioni .h è che lo standard consente loro di non essere file, ma essenzialmente "integrati". Tuttavia, ciò può essere apocrifo.
Clifford,

11

Basta seguire la convenzione utilizzata dal progetto / team.


11

Personalmente non ho mai visto .ccin nessun progetto a cui ho lavorato, ma in tutta tecnicità al compilatore non importa.

Chi se ne occuperà saranno gli sviluppatori che lavorano sulla tua fonte, quindi la mia regola empirica è quella di andare con ciò che il tuo team è a suo agio. Se la tua "squadra" è la comunità open source, scegli qualcosa di molto comune, di cui .cppsembra essere il preferito.


Diversi progetti ben noti come github.com/google/googletest stanno utilizzando .cccome estensione di file per i file di implementazione C ++
Vertexwahn

10

Come per la maggior parte delle convenzioni di stile, ci sono solo due cose che contano:

  1. Sii coerente in ciò che usi, ove possibile.
  2. Non progettare nulla che dipenda da una scelta specifica utilizzata.

Questi possono sembrare in contraddizione, ma ognuno di essi ha valore per le proprie ragioni.


8

.Ce .ccsembrano essere standard per i (pochi) programmi C ++ orientati a Unix che ho visto. Mi sono sempre abituato .cpp, dato che lavoro davvero solo su Windows e questo è lo standard lì da sempre.

Lo consiglio .cpppersonalmente, perché ... sta per "C Plus Plus". È ovviamente di vitale importanza che le estensioni dei file siano acronimi, ma se questa logica dovesse rivelarsi insufficientemente convincente, altre cose importanti sono il non utilizzo del tasto Maiusc (che esclude .Ce .c++) e l'evitamento dei metacaratteri delle espressioni regolari ove possibile (che esclude .c++- sfortunatamente non puoi proprio evitarlo, .ovviamente.).

Questo non esclude .cc, quindi anche se in realtà non rappresenta nulla (o lo fa?) È probabilmente una buona scelta per il codice orientato a Linux.


2
Ma "cpp" potrebbe anche indicare "preprocessore C". In effetti, il programma "cpp" sul tuo sistema è molto probabilmente il preprocessore C ...
Jesper

8

Ho usato .C e .h rispettivamente per sorgente e intestazione. Una cosa carina con quella scelta è che, dalla riga di comando, è facile da usare *.[Ch]per selezionare tutti i file di codice. L'uso .Cpotrebbe essere un problema sui filesystem insensibili al maiuscolo / minuscolo, ma se hai foo.ce foo.Cnella stessa directory, ti meriti comunque quello che ottieni :)


8

L'estensione .cc è necessaria per usare le regole implicite nei makefile. Dai un'occhiata a questi link per capire meglio i makefile, ma guarda principalmente al secondo, poiché dice chiaramente l'utilità dell'estensione .cc:

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

Ne ho appena saputo ora.


Ancora una volta sono solo .cppfile. Nessun problema ! :-)
Tom Taylor il

1
Dice "Ti invitiamo a usare il suffisso '.cc' per i file sorgente C ++ anziché '.C'." Ho il sospetto che sia solo una povera formulazione. L'uso .Cpuò essere problematico su sistemi con file system senza distinzione tra maiuscole e minuscole. Non penso che ci sia alcun vantaggio particolare, per quanto makeriguarda, nell'usare .ccover .cpp, per esempio. I makefile funzionano bene con i .cppfile sorgente C ++.
Keith Thompson,

7

Non importa quale di quelle estensioni useresti. Scegli quello che ti piace di più, basta essere coerenti con la denominazione. L'unica eccezione di cui sono a conoscenza con questa convenzione di denominazione è che non sono riuscito WinDDK(o è WDKadesso?) A compilare .ccfile. Su Linux, però, non è certo un problema.


6

Sto iniziando un nuovo progetto C ++ e ho iniziato a cercare le ultime novità in stile C ++. Sono finito qui per quanto riguarda la denominazione dei file e ho pensato che avrei condiviso il modo in cui ho trovato la mia scelta. Ecco qui:

Stroustrup lo vede più come una considerazione aziendale che tecnica .

Seguendo il suo consiglio, controlliamo cosa si aspettano le toolchain.

Per UNIX / Linux, puoi interpretare le seguenti GNU predefinite come regole per favorire il suffisso del nome file .cc, poiché le regole .cpp e .C sono solo alias:

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

(Nota: non esiste un alias COMPILE.cxx predefinito)

Quindi se stai prendendo di mira UNIX / Linux, sia .cc che .cpp sono ottime opzioni.

Quando scegli come target Windows, stai cercando problemi con .C, poiché il suo file system non fa distinzione tra maiuscole e minuscole. E potrebbe essere importante notare che Visual Studio favorisce il suffisso .cpp

Quando prendi di mira macOS, nota che Xcode preferisce .cpp / .hpp (appena verificato su Xcode 10.1). Puoi sempre cambiare il modello di intestazione per usare .h.

Per quello che vale, puoi anche basare la tua decisione sulle basi di codice che ti piacciono. Google usa .cc e LLVM libc ++ usa .cpp, per esempio.

E i file di intestazione? Sono compilati nel contesto di un file C o C ++, quindi non è necessario compilare o compilare il sistema per distinguere .h da .hpp. L'evidenziazione della sintassi e il rientro automatico da parte del tuo editor / IDE possono tuttavia rappresentare un problema, ma questo problema viene risolto associando tutti i file .h a una modalità C ++. Ad esempio, my emacs config su Linux carica tutti i file .h in modalità C ++ e modifica le intestazioni C bene. Oltre a ciò, quando si mescolano C e C ++, è possibile seguire questo consiglio .

La mia conclusione personale : .cpp / .h è il percorso di minor resistenza.


3

Come altri hanno scritto prima di me, alla fine è ciò che viene utilizzato dal tuo progetto / team / azienda.

Personalmente, non sto usando l' ccestensione, sto cercando di ridurre il numero di estensioni e non aumentarle, a meno che non ci sia un valore chiaro (secondo me).

Per quello che vale, questo è quello che sto usando :

c - Solo codice C puro, nessuna classe o struttura con metodi.

cpp - Codice C ++

hpp- Codice solo intestazioni. Le implementazioni sono nelle intestazioni (come le classi di template)

h- file di intestazione sia per C / C ++. Sono d'accordo che si possa fare un'altra distinzione, ma come ho scritto, sto cercando di ridurre il numero di estensioni per semplicità. Almeno dai progetti C ++ in cui ho lavorato, i hfile per pure-C sono più rari, quindi non volevo aggiungere un'altra estensione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.