Derleme kodu üretimi, mevcut kitaplıklar, dil özellikleri vb. Açısından C ve C ++ kodunu derlerken 3 derleyici CC, gcc, g ++ arasındaki fark nedir?
Derleme kodu üretimi, mevcut kitaplıklar, dil özellikleri vb. Açısından C ve C ++ kodunu derlerken 3 derleyici CC, gcc, g ++ arasındaki fark nedir?
Yanıtlar:
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:
İşin zor kısmı, platforma özgü olduğu için, 'CC' (ve 'cc') anlamına gelir.
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.
CC
sistemin 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, CC
neredeyse her zaman /usr/bin/gcc
.
gcc
GNU 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
.
./configure
+ ' nın kullanılan C derleyicisini etkilemek için make
adlandı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.
Linux'ta cc olan sadece bir bilgi eklemek istiyorum. Gcc ile bağlantılıdır. Kontrol etmek için.
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++