Różnica między CC, gcc i g++?

Jaka jest różnica pomiędzy 3 kompilatorami CC, gcc, g++ podczas kompilacji Kod C i c++ pod względem montażu generowanie kodu, dostępne biblioteki, funkcje językowe itp.?

Author: mrflash818, 2009-10-04

3 answers

ODPOWIEDŹ na to pytanie jest specyficzna dla platformy; to, co dzieje się na Linuksie, różni się od tego, co dzieje się na przykład na Solarisie.

Łatwą częścią (ponieważ nie jest specyficzna dla platformy) jest rozdzielenie 'gcc' i ' G++':

  • GCC jest kompilatorem GNU C z GCC (GNU Compiler Collection).
  • G++ jest kompilatorem GNU C++ z GCC.

Najtrudniejszą częścią, ponieważ jest specyficzna dla platformy, jest znaczenie "CC" (i "cc").

  • na Solarisie CC jest zwykle nazwa kompilatora Sun C++.
  • na Solarisie CC jest zwykle nazwą kompilatora Sun C.
  • w Linuksie, jeśli istnieje, CC jest prawdopodobnie linkiem do g++.
  • w Linuksie CC jest linkiem do gcc.

Jednak nawet na Solarisie może być tak, że CC jest starym kompilatorem C opartym na BSD z /usr/ucb. W praktyce, to zwykle nie jest zainstalowany i jest po prostu stub, który nie powiedzie, siejąc spustoszenie na tych, którzy próbują skompilować i zainstalować samo konfigurujące się oprogramowanie.

On HP-UX, domyślne' cc ' jest nadal kompilatorem K&R-only C zainstalowanym, aby umożliwić ponowne połączenie jądra, gdy jest to konieczne, i nie nadaje się do pracy w nowoczesnym oprogramowaniu, ponieważ nie obsługuje standardowego C. Musisz użyć alternatywnych nazw kompilatorów ('acc' IIRC). Podobnie w AIX kompilator systemu C używa nazw takich jak " xlc " lub "xlc32".

Klasycznie, domyślny kompilator systemu został nazwany ' cc ' i samo-konfigurujące się oprogramowanie wraca do tej nazwy, gdy nie wie, co jeszcze użyj.

POSIX podjął próbę uregulowania tego problemu, wymagając istnienia programów c89 (pierwotnie), a później c99; są to Kompilatory zgodne ze standardami ISO/IEC 9899:1989 i 9899:1999 C. Wątpliwe jest, czy POSIX odniósł sukces.


Pytanie zadaje pytanie o różnice w zakresie funkcji i bibliotek. Tak jak wcześniej, odpowiedź jest specyficzna dla platformy w części, a ogólna w części.

Wielki podzial jest miedzy kompilatorami C i C++ Kompilatory. Kompilatory C++ będą akceptować programy C++ i nie będą kompilować dowolnych programów C. (Chociaż możliwe jest zapisanie C w podzbiorze, który jest również rozumiany przez C++, wiele programów C nie jest poprawnymi programami C++). Podobnie kompilatory C akceptują programy C i odrzucają większość programów C++ (ponieważ większość programów C++ używa konstrukcji niedostępnych w C).

Zestaw dostępnych bibliotek zależy od języka. Programy C++ mogą Zwykle korzystać z bibliotek C na danej platformy; programy C zazwyczaj nie mogą używać bibliotek C++. Tak więc C++ ma większy zestaw dostępnych bibliotek.

Zauważ, że jeśli korzystasz z Solarisa, kod obiektowy wyprodukowany przez CC nie jest zgodny z kodem obiektowym wyprodukowanym przez g++ - są to dwa oddzielne Kompilatory z osobnymi konwencjami dla takich rzeczy, jak obsługa wyjątków i namaglowanie nazw (a nazwa namaglowanie jest celowo Inna, aby zapewnić, że niekompatybilne pliki obiektowe nie są połączone razem!). Oznacza to, że jeśli aby użyć biblioteki skompilowanej za pomocą CC, należy skompilować cały program za pomocą CC. Oznacza to również, że jeśli chcesz użyć jednej biblioteki skompilowanej z CC, a innej skompilowanej z g++, masz pecha. Musisz przynajmniej przekompilować jedną z bibliotek.

Jeśli chodzi o jakość generowanego asemblera, GCC (GNU Compiler Collection) wykonuje bardzo dobrą robotę. Ale czasami natywne Kompilatory działają nieco lepiej. Kompilatory Intela mają bardziej rozbudowane optymalizacje, które jeszcze nie jak sądzę, były replikowane w GCC. Ale każdy taki pontyfikat jest niebezpieczny, a my nie wiemy, o jaką platformę chodzi.

Jeśli chodzi o funkcje języka, Kompilatory generalnie są dość zbliżone do obecnych standardów (C++98, C++2003, C99), ale zazwyczaj występują niewielkie różnice między językiem standardowym a językiem obsługiwanym przez kompilator. Starsze wsparcie standardu C89 jest zasadniczo takie samo (i kompletne) dla wszystkich kompilatorów C. Są różnice w ciemniejszych zakamarkach języka. Musisz zrozumieć 'undefined behaviour', 'system defined behaviour 'i' unsefined behaviour'; jeśli wywołasz undefined behaviour, otrzymasz różne wyniki w różnych momentach. Istnieje również wiele opcji (szczególnie z GCC), aby poprawić zachowanie kompilatora. GCC ma wiele rozszerzeń, które ułatwiają życie, jeśli wiesz, że celujesz tylko w rodzinę kompilatorów.

 92
Author: Jonathan Leffler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-04 15:49:07

CC jest zmienną środowiskową odnoszącą się do kompilatora systemu C. To, na co wskazuje (dostępne biblioteki itp.) zależy od platformy. Często wskazuje na /usr/bin/cc, rzeczywisty kompilator c (sterownik). Na platformach linuksowych CC prawie zawsze wskazuje na /usr/bin/gcc.

gcc jest binarnym sterownikiem dla GNU compiler collection. Może kompilować C, C++ i ewentualnie inne języki; określa język przez rozszerzenie pliku.

g++ jest sterownikiem binarnym jak gcc, ale z kilkoma specjalnymi opcjami ustawionymi do kompilacji C++. Z mojego doświadczenia wynika, że g++ domyślnie łączy libstdc++, podczas gdy gcc nie.

 20
Author: Managu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-04 15:04:12

Chcę dodać tylko jedną informację co cc w Linuksie. Jest związany z gcc. Żeby to sprawdzić. Tutaj wpisz opis obrazka

Podobnie, to samo z 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++
 0
Author: Uddhav Gautam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-13 15:37:04