Differenza tra CC, gcc e g ++?


104

Qual è la differenza tra i 3 compilatori CC, gcc, g ++ durante la compilazione di codice C e C ++ in termini di generazione di codice assembly, librerie disponibili, funzionalità del linguaggio, ecc.?


1
Come indicato nella mia risposta, la risposta alla tua domanda dipende dalla piattaforma, ma la piattaforma non è specificata.
Jonathan Leffler

Risposte:


122

La risposta a questa domanda è specifica della piattaforma; ciò che accade su Linux è diverso da ciò che accade su Solaris, per esempio.

La parte facile (perché non è specifica della piattaforma) è la separazione di "gcc" e "g ++":

  • gcc è il compilatore GNU C della GCC (GNU Compiler Collection).
  • g ++ è il compilatore GNU C ++ del GCC.

La parte difficile, perché è specifica della piattaforma, è il significato di "CC" (e "cc").

  • Su Solaris, CC è normalmente il nome del compilatore Sun C ++.
  • Su Solaris, cc è normalmente il nome del compilatore Sun C.
  • Su Linux, se esiste, CC è probabilmente un collegamento a g ++.
  • Su Linux, cc è un collegamento a gcc.

Tuttavia, anche su Solaris, potrebbe essere che cc sia il vecchio compilatore C basato su BSD da /usr/ucb. In pratica, questo di solito non è installato e c'è solo uno stub che fallisce, devastando coloro che cercano di compilare e installare software auto-configurante.

Su HP-UX, il 'cc' predefinito è ancora un compilatore C solo K & R installato per consentire il ricollegamento del kernel quando necessario e inutilizzabile per il lavoro del software moderno perché non supporta lo standard C.Devi usare nomi di compilatori alternativi ("acc" IIRC). Allo stesso modo, su AIX, il compilatore C di sistema ha nomi come "xlc" o "xlc32".

Classicamente, il compilatore di sistema predefinito era chiamato "cc" e il software di configurazione automatica ricorre a quel nome quando non sa cos'altro usare.

POSIX ha tentato di legiferare intorno a questo richiedendo l'esistenza dei programmi c89 (originariamente) e successivamente c99; questi sono i compilatori compatibili con gli standard ISO / IEC 9899: 1989 e 9899: 1999 C. È dubbio che POSIX abbia avuto successo.


La domanda fa domande sulle differenze in termini di funzionalità e librerie. Come prima, la risposta è in parte specifica della piattaforma e in parte generica.

Il grande divario è tra i compilatori C e i compilatori C ++. I compilatori C ++ accetteranno programmi C ++ e non compileranno programmi C arbitrari. (Sebbene sia possibile scrivere C in un sottoinsieme compreso anche da C ++, molti programmi C non sono programmi C ++ validi). Allo stesso modo, i compilatori C accetteranno i programmi C e rifiuteranno la maggior parte dei programmi C ++ (perché la maggior parte dei programmi C ++ utilizza costrutti non disponibili in C).

Il set di librerie disponibili per l'uso dipende dalla lingua. I programmi C ++ possono solitamente utilizzare le librerie C su una determinata piattaforma; I programmi C di solito non possono utilizzare le librerie C ++. Quindi, C ++ ha un set più ampio di librerie disponibili.

Nota che se sei su Solaris, il codice oggetto prodotto da CC non è compatibile con il codice oggetto prodotto da g ++ - sono due compilatori separati con convenzioni separate per cose come la gestione delle eccezioni e la modifica del nome (e la modifica del nome è deliberatamente diverso per garantire che i file oggetto incompatibili non siano collegati tra loro!). Ciò significa che se vuoi usare una libreria compilata con CC, devi compilare l'intero programma con CC. Significa anche che se vuoi usare una libreria compilata con CC e un'altra compilata con g ++, sei sfortunato. Devi ricompilare almeno una delle librerie.

In termini di qualità dell'assemblatore generato, GCC (GNU Compiler Collection) fa un ottimo lavoro. Ma a volte i compilatori nativi funzionano un po 'meglio. I compilatori Intel hanno ottimizzazioni più estese che non sono state ancora replicate in GCC, credo. Ma qualsiasi pontificazione di questo tipo è pericolosa mentre non sappiamo di quale piattaforma ti preoccupi.

In termini di caratteristiche del linguaggio, i compilatori generalmente sono abbastanza vicini agli standard attuali (C ++ 98, C ++ 2003, C99), ma di solito ci sono piccole differenze tra il linguaggio standard e il linguaggio supportato dal compilatore. Il supporto dello standard C89 precedente è essenzialmente lo stesso (e completo) per tutti i compilatori C. Ci sono differenze negli angoli più oscuri della lingua. È necessario comprendere "comportamento non definito", "comportamento definito dal sistema" e "comportamento non specificato"; se invochi un comportamento indefinito, otterrai risultati diversi in momenti diversi. Ci sono anche molte opzioni (specialmente con GCC) per modificare il comportamento del compilatore. Il GCC ha una varietà di estensioni che rendono la vita più semplice se sai che stai prendendo di mira solo quella famiglia di compilatori.


1
E su OSX (Sierra 10.2 almeno), è un collegamento simbolico a clang.
Josh Kodroff

26

CCè una variabile di ambiente che fa riferimento al compilatore C del sistema. Ciò a cui punta (librerie accessibili, ecc.) Dipende dalla piattaforma. Spesso punterà a /usr/bin/cc, l'effettivo compilatore c (driver). Sulle piattaforme Linux, CCpunta quasi sempre a /usr/bin/gcc.

gccè il binario del driver per la raccolta del compilatore GNU. Può compilare C, C ++ e possibilmente altri linguaggi; determina la lingua in base all'estensione del file.

g++è un driver binario simile gcc, ma con alcune opzioni speciali impostate per la compilazione di C ++. In particolare (nella mia esperienza), g++collegherà libstdc ++ per impostazione predefinita, mentre gccnon lo farà.


1
Puoi spiegare cosa intendi per "driver binario"?
Edan Maor

5
La maggior parte dei compilatori C, ma in particolare GCC, ha un numero di programmi che svolgono il lavoro di compilazione. Esiste un programma di primo livello, chiamato "gcc", che è il driver del compilatore; analizza una miriade di opzioni della riga di comando e orchestra le altre fasi del compilatore: il parser / analizzatore, l'ottimizzatore, l'assemblatore e il linker, in genere (il preprocessore di solito non è una fase separata di questi tempi, a meno che non si richieda solo la pre-elaborazione). Questo (il driver del compilatore) è un programma piuttosto complesso, anche se non tocca mai un file sorgente C.
Jonathan Leffler

3
CC è anche il compilatore Sun C ++ e non una variabile d'ambiente.
Jonathan Leffler

1
Anche il compilatore C ++ di SGI è CC.
alex tingle

Beh, suppongo che Managu stia pensando che ./configure+ makepossa prendere una variabile d'ambiente chiamata CCper influenzare il compilatore C usato, ma per il resto non c'è generalmente una variabile d'ambiente con quel nome.
effimero

5

Voglio aggiungere solo un'informazione quale cc in Linux. È collegato a gcc. Per controllarlo. inserisci qui la descrizione dell'immagine

Allo stesso modo, la stessa cosa con c ++.

uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz  
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++
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.