CC, gcc ve g ++ arasındaki fark nedir?


Yanıtlar:


126

Bunun cevabı platforma özeldir; örneğin, Linux'ta olanlar Solaris'te olanlardan farklıdır.

İşin kolay kısmı (platforma özgü olmadığı için) 'gcc' ve 'g ++' ayrımıdır:

  • gcc, GCC'nin (GNU Derleyici Koleksiyonu) GNU C Derleyicisidir.
  • g ++, GCC'nin GNU C ++ Derleyicisidir.

İşin zor kısmı, platforma özgü olduğu için, 'CC' (ve 'cc') anlamına gelir.

  • Solaris'te CC normalde Sun C ++ derleyicisinin adıdır.
  • Solaris'te cc normalde Sun C derleyicisinin adıdır.
  • Linux'ta varsa, CC muhtemelen g ++ 'ya bir bağlantıdır.
  • Linux'ta cc, gcc'ye bir bağlantıdır.

Bununla birlikte, Solaris'te bile, cc'nin eski BSD tabanlı C derleyicisi olabilir /usr/ucb. Pratikte, bu genellikle kurulmaz ve sadece kendi kendini yapılandıran yazılımı derlemeye ve kurmaya çalışanlara zarar veren, başarısız olan bir saplama vardır.

HP-UX'te, varsayılan 'cc', gerektiğinde çekirdeğin yeniden bağlanmasına izin vermek için kurulmuş bir yalnızca K & R C derleyicisidir ve standart C'yi desteklemediği için modern yazılım çalışması için kullanılamaz. Alternatif derleyici adları kullanmanız gerekir. ('acc' IIRC). Benzer şekilde, AIX üzerinde, sistem C derleyicisi 'xlc' veya 'xlc32' gibi adlarla gider.

Klasik olarak, varsayılan sistem derleyicisine 'cc' adı verilir ve kendi kendini yapılandıran yazılım, başka ne kullanacağını bilmediğinde bu adı kullanır.

POSIX, c89 (başlangıçta) ve daha sonra c99 programlarının var olmasını zorunlu kılarak bu konuda kendi yolunu düzenlemeye çalıştı; bunlar ISO / IEC 9899: 1989 ve 9899: 1999 C standartlarıyla uyumlu derleyicilerdir. POSIX'in başarılı olduğu şüphelidir.


Soru, özellikler ve kitaplıklar açısından farklılıkları sorar. Daha önce olduğu gibi, cevap kısmen platforma özgü ve kısmen geneldir.

Büyük bölünme, C derleyicileri ile C ++ derleyicileri arasındadır. C ++ derleyicileri, C ++ programlarını kabul edecek ve rastgele C programlarını derlemeyecektir. (C ++ tarafından da anlaşılan bir alt kümeye C yazmak mümkün olsa da, birçok C programı geçerli C ++ programları değildir). Benzer şekilde, C derleyicileri C programlarını kabul edecek ve çoğu C ++ programını reddedecektir (çünkü çoğu C ++ programı C'de bulunmayan yapıları kullanır).

Kullanılabilen kitaplık seti dile bağlıdır. C ++ programları genellikle belirli bir platformda C kitaplıklarını kullanabilir; C programları genellikle C ++ kitaplıklarını kullanamaz. Dolayısıyla, C ++ daha geniş bir kitaplık setine sahiptir.

Solaris üzerindeyseniz, CC tarafından üretilen nesne kodunun g ++ tarafından üretilen nesne koduyla uyumlu olmadığını unutmayın - bunlar, istisna işleme ve ad değiştirme gibi şeyler için ayrı kurallara sahip iki ayrı derleyicidir (ve adın karıştırılması kasıtlı olarak yapılır) uyumsuz nesne dosyalarının birbirine bağlanmamasını sağlamak için farklı!). Bu, CC ile derlenmiş bir kitaplık kullanmak istiyorsanız, tüm programınızı CC ile derlemeniz gerektiği anlamına gelir. Ayrıca, CC ile derlenmiş bir kitaplığı ve g ++ ile derlenmiş bir diğerini kullanmak istiyorsanız, şansınız kalmaz demektir. En azından kitaplıklardan birini yeniden derlemelisiniz.

Oluşturulan derleyicinin kalitesi açısından, GCC (GNU Derleyici Koleksiyonu) çok iyi bir iş çıkarır. Ancak bazen yerel derleyiciler biraz daha iyi çalışır. Intel derleyicilerinin henüz GCC'de kopyalanmamış daha kapsamlı optimizasyonlara sahip olduğuna inanıyorum. Ancak, hangi platformla ilgilendiğinizi bilmediğimiz halde, bu türden herhangi bir pontifikasyon tehlikelidir.

Dil özellikleri açısından, derleyicilerin tümü genel olarak mevcut standartlara oldukça yakındır (C ++ 98, C ++ 2003, C99), ancak standart dil ile derleyici tarafından desteklenen dil arasında genellikle küçük farklılıklar vardır. Eski C89 standart desteği esasen tüm C derleyicileri için aynıdır (ve eksiksizdir). Dilin karanlık köşelerinde farklılıklar var. 'Tanımlanmamış davranış', 'sistem tanımlı davranış' ve 'belirtilmemiş davranış' anlamanız gerekir; Tanımlanmamış bir davranışı çağırırsanız, farklı zamanlarda farklı sonuçlar alırsınız. Derleyicinin davranışını değiştirmek için birçok seçenek (özellikle GCC ile) vardır. GCC, yalnızca o derleyici ailesini hedeflediğinizi biliyorsanız hayatı kolaylaştıran çeşitli uzantılara sahiptir.


1
Ve OSX'te (en azından Sierra 10.2), clang için bir sembolik bağlantı.
Josh Kodroff

27

CCsistemin C derleyicisine atıfta bulunan bir ortam değişkenidir. Gösterdiği şey (erişilebilir kütüphaneler, vb.) Platforma bağlıdır. Genellikle /usr/bin/cc, gerçek c düzenleyiciyi (sürücü) gösterir. Linux platformlarında, CCneredeyse her zaman /usr/bin/gcc.

gccGNU derleyici koleksiyonu için sürücü ikilisidir. C, C ++ ve muhtemelen diğer dilleri derleyebilir; dili dosya uzantısına göre belirler.

g++gibi bir sürücü ikili dosyasıdır gcc, ancak C ++ 'ı derlemek için birkaç özel seçenek vardır. Bilhassa (benim deneyimime göre) g++libstdc ++ 'yı varsayılan olarak bağlayacak, ancak bağlanmayacaktır gcc.


1
Lütfen "sürücü ikili" ile ne demek istediğinizi açıklar mısınız?
Edan Maor

5
Çoğu C derleyicisi, ancak özellikle GCC, derleme işini yapan birkaç programa sahiptir. Derleyici sürücüsü olan 'gcc' adında üst düzey bir program vardır; sayısız komut satırı seçeneğini ayrıştırır ve derleyicinin diğer aşamalarını düzenler - ayrıştırıcı / çözümleyici, optimize edici, derleyici ve bağlayıcı, tipik olarak (önişlemci, yalnızca ön işleme talep etmediğiniz sürece bu günlerde genellikle ayrı bir aşama değildir). Bu (derleyici sürücüsü), bir C kaynak dosyasının kendisine hiçbir zaman dokunmasa da oldukça karmaşık bir programdır.
Jonathan Leffler

3
CC aynı zamanda Sun C ++ derleyicisidir ve bir ortam değişkeni değildir.
Jonathan Leffler

1
SGI'ın C ++ derleyicisi de CC'dir.
alex tingle

Sanırım Managu, ./configure+ ' nın kullanılan C derleyicisini etkilemek için makeadlandırılmış bir ortam değişkenini alabileceğini düşünüyor CC, ancak aksi takdirde genellikle bu isimde bir ortam değişkeni yoktur.
ephemient

6

Linux'ta cc olan sadece bir bilgi eklemek istiyorum. Gcc ile bağlantılıdır. Kontrol etmek için. görüntü açıklamasını buraya girin

Benzer şekilde, c ++ ile aynı şey.

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++
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.