Qual è la differenza tra g ++ e gcc?

Qual è la differenza tra g ++ e gcc? Quali dovrebbero essere usati per lo sviluppo generale del c ++?

gcc e g++ sono compilatori-driver del ‘Gnu Compiler Collection ‘ (che era una volta solo il ‘Gnu C Compiler ‘).

Anche se determinano automaticamente quali backend ( cc1plus …) chiamare a seconda del tipo di file, a meno che non siano sovrascritti con il -x language , hanno alcune differenze.

La differenza probabilmente più importante nei loro valori predefiniti è quali librerie vengono collegate automaticamente.

Secondo le opzioni di collegamento della documentazione online di GCC e come viene invocato g++ , g++ equivale a gcc -xc++ -lstdc++ -shared-libgcc (il primo è un’opzione del compilatore, le seconde due sono opzioni del linker). Questo può essere verificato eseguendo entrambi con l’opzione -v (mostra i comandi del backend toolchain che vengono eseguiti).

GCC: raccolta del compilatore GNU

  • Referenti di tutte le lingue diverse supportate dal compilatore GNU.

gcc: GNU C Compiler
g ++: compilatore GNU C ++

Le principali differenze:

  1. gcc compilerà: * .c / *. cpp file come C e C ++ rispettivamente.
  2. g ++ compilerà: * .c / *. cpp file ma saranno tutti trattati come file C ++.
  3. Inoltre, se usi g ++ per colbind i file object, si collega automaticamente alle librerie C ++ std (gcc non lo fa).
  4. gcc che compila i file C ha meno macro predefinite.
  5. La compilazione di gcc * .cpp e g ++ che compila i file * .c / *. cpp ha alcune altre macro.

Extra Macros durante la compilazione di file * .cpp:

 #define __GXX_WEAK__ 1 #define __cplusplus 1 #define __DEPRECATED 1 #define __GNUG__ 4 #define __EXCEPTIONS 1 #define __private_extern__ extern 

Per c ++ dovresti usare g ++.

È lo stesso compilatore (ad esempio la raccolta del compilatore GNU). GCC o G ++ scelgono semplicemente un front-end diverso con diverse opzioni predefinite.

In poche parole: se usi g ++ il frontend dirà al linker che potresti voler colbind alle librerie standard di C ++. Il frontend di gcc non lo farà (potrebbe anche collegarsi a loro se si passano le giuste opzioni da linea di comando).

Qual è la differenza tra g++ e gcc ?

gcc è evoluto da una sola lingua “GNU C Compiler” per essere una “Collezione GNU Compiler” multilingue. Il termine “GNU C Compiler” è ancora usato a volte nel contesto della programmazione in C.

g++ è il compilatore C ++ per la raccolta del compilatore GNU. Come gnat è il compilatore Ada per gcc . vedi Usare la GNU Compiler Collection (GCC)

Ad esempio, il comando man g++ Ubuntu 16.04 restituisce la pagina di manuale di GCC(1) .

L’ man gcc afferma che …

g++ accetta principalmente le stesse opzioni di gcc

e che il default …

… l’uso di gcc non aggiunge la libreria C ++. g++ è un programma che chiama GCC e specifica automaticamente il collegamento con la libreria C ++. Tratta file .c, .h e .i come file sorgente C ++ invece di file sorgente C a meno che non venga usato -x. Questo programma è utile anche per precompilare un file di intestazione C con un’estensione .h da utilizzare nelle compilazioni C ++.

Cerca le pagine man di gcc per maggiori dettagli sulle varianti di gcc di gcc e g++ .

Quale dovrebbe essere usato per lo sviluppo generale del c ++?

O gcc o g++ possono essere usati per lo sviluppo generale del C ++ con le impostazioni delle opzioni applicabili. Tuttavia, il comportamento predefinito di g++ è più naturalmente allineato a uno sviluppo centrico di C ++.

Sebbene i comandi gcc e g ++ facciano cose molto simili, g ++ è progettato per essere il comando da invocare per compilare un programma C ++; è destinato a fare automaticamente la cosa giusta.

Dietro le quinte, sono davvero lo stesso programma. Come ho capito, entrambi decidono se compilare un programma come C o come C ++ basato sull’estensione del nome file. Entrambi sono in grado di collegarsi alla libreria standard C ++, ma solo g ++ lo fa per impostazione predefinita. Quindi se hai un programma scritto in C ++ che non ha bisogno di collegarsi alla libreria standard, gcc accadrà per fare la cosa giusta; ma poi, così sarebbe g ++. Quindi non c’è davvero alcuna ragione per non usare g ++ per lo sviluppo generale del C ++.

Mi sono interessato al problema e ho fatto alcuni esperimenti

  1. Ho trovato questa descrizione qui , ma è molto breve.

  2. Poi ho provato a sperimentare con gcc.exe e g ++. Exe sulla mia macchina Windows:

     $ g++ --version | head -n1 g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3 $ gcc --version | head -n1 gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3 
  3. Ho provato a compilare i file di test semplici c89, c99 e c ++ 1998 e funziona bene con estensioni corrette corrispondenti per lingua

     gcc -std=c99 test_c99.c gcc -std=c89 test_c89.c g++ -std=c++98 test_cpp.cpp gcc -std=c++98 test_cpp.cpp 
  4. Ma quando provo a lanciare lo strumento “gnu compiler collection” in questo modo:

     $ gcc -std=c++98 test_cpp.c cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default] 
  5. Ma questo funziona ancora senza errori

     $ gcc -x c++ -std=c++98 test_cpp.c 
  6. E anche questo

     $ g++ -std=c++0x test_cpp_11.cpp 

ps File di test

 $ cat test_c89.c test_c99.c test_cpp.cpp // C89 compatible file int main() { int x[] = {0, 2}; return sizeof(x); } // C99 compatible file int main() { int x[] = {[1]=2}; return sizeof(x); } // C++1998,2003 compatible file class X{}; int main() { X x; return sizeof(x); } // C++11 #include  enum class Color : int{red,green,blue}; // scoped enum int main() { std::vector a {1,2,3}; // bracket initialization return 0; } 

I risultati:

  1. Se si guarda all’albero dei processi allora sembra che gcc, e g ++ sia backend ad altri strumenti, che nel mio ambiente sono: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe

  2. gcc funziona bene come metatool se hai un’estensione corretta o imposta i flag -std -x corretti. Vedi questo

“GCC” è un termine abbreviato comune per la raccolta del compilatore GNU. Questo è sia il nome più generico per il compilatore, sia il nome usato quando si pone l’enfasi sulla compilazione di programmi in C (poiché l’abbreviazione anticamente rappresentava “GNU C Compiler”).

Quando si fa riferimento alla compilazione C ++, è normale chiamare il compilatore “G ++”. Poiché esiste un solo compilatore, è anche corretto chiamarlo “GCC” indipendentemente dal contesto della lingua; tuttavia, il termine “G ++” è più utile quando l’accento è posto sulla compilazione di programmi C ++.

Potresti leggere di più qui .

L’unica differenza degna di nota è che se si passa un file .c a gcc verrà compilato come C, mentre g ++ lo tratterà sempre come C ++.

Stavo testando gcc e g ++ in un sistema Linux. Usando MAKEFILE, posso definire il compilatore usato da “GNU make”. Ho provato con la cosiddetta funzione di “memoria dynamic” di localizzazione di “C plus plus” di:

 int main(){ int * myptr = new int; * myptr = 1; printf("myptr[0] is %i\n",*myptr); return 0; } 

Solo g ++ può compilare con successo sul mio computer mentre gcc segnalerà un errore

 undefined reference to `operator new(unsigned long)' 

Quindi la mia conclusione è che gcc non supporta completamente “C plus plus”. Sembra che scegliere g ++ per i file sorgente C ++ sia un’opzione migliore.

gcc e g ++ sono entrambi compilatori GNU. Entrambi compilano c e c ++. La differenza è per i file * .c gcc lo considera come un programma in ca, e g ++ lo vede come un programma ac ++. * I file .cpp sono considerati programmi c ++. c ++ è un super set di c e la syntax è più severa, quindi fai attenzione al suffisso.