C, C99, ANSI C ve GNU C arasındaki fark nedir?


124

Codechef üzerinde programlama pratiği yapmaya başladım ve C ile C99 arasındaki fark yüzünden kafam karıştı . C burada ne anlama geliyor? C89 mu? Bu gönderinin altındaki dilleri kontrol edin . Hem C hem de C99 içerir.

İnternette GNU C adında bir şey buldum. Linux / unix sistemleri için farklı bir C var mı? Bunlar ANSI'nin C standartlarına uygun mu? Ayrıca bazı yerlerde "C99 katı" okudum. Bu nedir?

Kullanımda başka farklı C standartları var mı? C 4.3.2 adında bir şey var mı yoksa şu anda kullanımda olan gcc sürümü mü?

DÜZENLE:

Bu , Bu , Bu yardımcı oldu. Cevapsız bırakılan şeyleri daha fazla arayacağım ve düzenleyeceğim.

Ben programlama acemi değilim. C dilinin ne olduğunu biliyorum. ANSI'nin C89, C99 ve C11 gibi farklı C standartları olduğunu biliyorum.


@ Çok fazla arama yapmayacaktım. Şimdi yaptım. Daha fazlasını yapacağım. ve soruyu daha fazla düzenleyin.
Aseem Bansal

@C99 katı hakkında ve kod çözümündeki C'nin C89 mu yoksa standartlaştırılmamış önceki orijinal C mi olduğunu
bulamayacak mıyım?

1
POSIX C'yi unutmayın :-)
pmg

Yanıtlar:


217
  • C dilinin mucidi Dennis Ritchie'nin yazarlarından biri olduğu ünlü kitaptan sonra, standardizasyondan önceki her şeye genellikle "K&R C" adı verilir . Bu, 1972-1989 arası "C dili" idi.

  • İlk C standardı, ulusal standart enstitüsü ANSI tarafından 1989 yılında ABD'de ulusal olarak yayınlandı. Bu sürüm, C89 veya ANSI-C olarak adlandırılır. 1989-1990 arasında bu "C dili" idi.

  • Bir yıl sonra, Amerikan standardı uluslararası olarak kabul edildi ve ISO (ISO 9899: 1990) tarafından yayınlandı. Bu sürüm C90 olarak adlandırılır. Teknik olarak, C89 / ANSI-C ile aynı standarttır. Resmi olarak, C89 / ANSI-C'nin yerini alarak onları eski haline getirdi. 1990-1999 arasında, C90 "C dili" idi.

    Lütfen 1989'dan beri ANSI'nin C diliyle ilgisi olmadığını unutmayın. Hala "ANSI C" den bahseden programcılar genel olarak ne anlama geldiğine dair hiçbir fikre sahip değiller. ISO, ISO 9899 standardı aracılığıyla C dilinin "sahibidir".

  • 1995'te bazen "C95" olarak anılan küçük bir güncelleme yayınlandı. Bu büyük bir revizyon değil, resmi olarak ISO / IEC 9899: 1990 / Amd.1: 1995 olarak adlandırılan teknik bir değişiklikti. Ana değişiklik, geniş karakter desteğinin getirilmesiydi.

  • 1999'da, C standardı büyük bir revizyondan geçti (ISO 9899: 1999). Standardın bu sürümüne C99 denir. 1999-2011 arasında bu "C dili" idi.

  • 2011'de C standardı tekrar değiştirildi (ISO 9899: 2011). Bu versiyona C11 adı verilir. Dile _Generic, _Static_assertve iş parçacığı desteği gibi çeşitli yeni özellikler eklendi. Güncellemede çok çekirdekli, çok işlemcili ve ifade sıralaması üzerinde yoğunlaşıldı. 2011-2017 arasında bu "C dili" idi.

  • 2017 yılında C11 revize edildi ve çeşitli hata raporları çözüldü. Bu standart gayri resmi olarak C17 olarak adlandırılır ve ISO 9899: 2018 olarak yayınlanmıştır. Yeni özellikler içermez, sadece düzeltmeler içerir. C dilinin güncel sürümüdür.


"C99 katı" büyük olasılıkla bir derleyiciyi standardı harfiyen takip etmeye zorlayan bir derleyici ayarını ifade eder. C standardında uygulamaya uyan bir terim vardır . Esasen şu anlama gelir: "bu derleyici aslında C dilini doğru bir şekilde uygular". C dilini doğru şekilde uygulayan programlar , resmi olarak kesinlikle uyumlu programlar olarak adlandırılır .

"GNU C" iki anlama gelebilir. GNU Derleyici Koleksiyonunun (GCC) bir parçası olarak gelen C derleyicisinin kendisi. Veya GCC C derleyicisinin kullandığı standart dışı varsayılan kurulum anlamına gelebilir. Eğer ile derlerseniz, gcc program.co zaman C standardına göre derleme yapmazsınız, bunun yerine "GNU C" olarak adlandırılabilecek standart olmayan bir GNU kurulumunu gerçekleştirmiş olursunuz. Örneğin, tüm Linux çekirdeği standart C'de değil, standart olmayan GNU C'de yapılır.

Programlarınızı C standardına göre derlemek istiyorsanız yazmalısınız gcc -std=c99 -pedantic-errors. GCC sürümünüz destekliyorsa c99'u c11 ile değiştirin.


8
Katı derleyici ayarı, "Uzantıları devre dışı bırak; sadece standart tarafından tanımlanan C dilini kullanın ve aynı zamanda veya daha fazla "doğru derleyin". Dilin uzantılarını kabul etmek tamamen doğrudur; standart buna izin vermek için tanımlandı.
Eric Postpischil

5
Ayrıca, esas olarak daha geniş karakter desteği ekleyen C94 / C95 Değişikliği 1 de vardı. Ayrıca C ve C ++ ' da Standart Üstbilgi Dosyalarının Listesi'ne bakın .
Jonathan Leffler

2
C90'dan C99'a birçok şeyin değiştiğini yazıyorsunuz. Lütfen birkaç isim verebilir misiniz?
Martin Thoma

3
@Lundin, K&R için yanlış kitabı bağladınız; bu, C89 standardını tanımlayan ikinci baskıdır.
Antti Haapala

5
Evet, ama önemli olan şu ki, C programlama dilini şu ana kadar tanımlayan sürüm bu değil; her yerde satışta olacağı için değil.
Antti Haapala

7

ANSI C konusunda yanıt vermeliyim. ANSI onunla hiçbir şey yapmamış olsa da, derleyiciler hala onun için oluşturulmuştur. Örneğin PIC XC16 derleyicisi: "Derleyici, ANSI spesifikasyonu (ANSI x3.159-1989) tarafından tanımlanan ve Kernighan ve Ritchie'nin C Programlama Dili'nde (ikinci baskı) açıklanan ANSI C standardına uyan, tamamen doğrulanmış bir derleyicidir. ... "Tüm programlama, PC'ler gibi" büyük "bilgisayarlar için değildir. Cihaz maliyetleriniz için bir derleyici yazmak ve zaman ve $ maliyetlerini doğrulamak. ANSI C, gömülü / gerçek zamanlı cihazlarınızda yaşıyor ve iyi yaşıyor.


4
  • ANSI C: İlk C dili 1989'da ANSI adı verilen yapı tarafından standartlaştırıldı, bu yüzden c89 olarak adlandırıldı.

  • C99:
    geliştirici gereksinimlerinden gelen taleple, 1999-2000'de C99'a ek anahtar sözcükler ve özellikler eklenmiştir (örn: satır içi, boole .. kayan noktalı artematik kitaplık işlevleri eklendi)

  • GNU C: GNU, unix benzeri bir işletim sistemidir (www.gnu.org) ve bir yerlerde GNU'nun projesi ANSI C standardına dayalı C programlama diline ihtiyaç duyar. GNU, kodu derlemek için GCC (GNU Derleyici Koleksiyonu) derleyicisini kullanır. Malloc, calloc, exit ... vb gibi sistem çağrılarını tanımlayan C kütüphanesi işlevi vardır.

ANSI C, diğer standartlar tarafından kullanılan veya hakemlik yapılan bir standarttır.


C99 katı hakkında herhangi bir şey ve kod kodundaki C'nin C89 mu yoksa daha önceki standartlaştırılmamış orijinal C
Aseem Bansal

Düzeltme: ANSI C, yalnızca güncel olmayan belgeler tarafından atıfta bulunulan eski bir standarttır. C dili, ISO C veya ISO / IEC 9899: 2011 olarak adlandırılır.
Lundin

1

Toplama için Lundin yılında Yanıt

İşte Dennis Richie Has nedir Say Sorulan zaman

"K&R 2. basımı yazmadan önce K&R neden nihai, onaylanmış ANSI standardını beklemedi?"

K&R, K&R 2. baskısını yazmadan önce neden nihai, onaylanmış ANSI standardını beklemedi? Görünüşe göre bu kitap, son ANSI standardının yerini almadan önce yalnızca birkaç ay için doğru standart olacak. Bu geç aşamada birkaç büyük değişiklik olacağını biliyorum, ancak neden birkaç ay bekleyip% 100 doğru aldığınızdan emin olmuyorsunuz, neredeyse hemen 3. baskı yazmak veya modası geçmiş olmak yerine?

İlk baskının 10. yıldönümünü kutlamanın güzel olacağını düşündük. Daha ciddisi, geçen yaz işe başladık çünkü o zamanlar zamanımız ve eğilimimiz vardı ve X3J11'in sona yaklaştığı görüldü. Aralık ve Ocak aylarında, bitirirken, önemli değişiklik olasılığının teslimatı erteleme gerekip gerekmediğini düşündük ve (konuyu yayıncı ile tartıştıktan sonra) beklemeye değmeyeceğine karar verdik. PH istiyordu ve Brian da ben de gündemimizden çıkmasını istiyorduk.

Standartta değişiklikler olsa bile, bunların yeni bir baskıyı garanti edecek kadar kapsamlı olacağını hayal etmek zor. (Sürmüş olsaydı, bir şekilde noalias ile başa çıkmaya bile hazırdık.) Gelecekteki bir baskıda gerekli değişiklikleri yapmaya hazırız, ancak küçük olmaları gerektiğini ummak için nedenler var. X3J11'in üyeleri de şaşırtıcı insanlar olmadan bitirmek için çok hevesliler; çoğu sonuçta ANSI derleyicileri hazırlayan şirketler için çalışıyor.

Dennis Ritchie


1
Ne yazık ki Dennis Ritchie, derleyicilerin yararlı örtüşme biçimlerini tanımak için herhangi bir çaba göstermemesi gerektiğini ima etmek için takma kuralların nasıl kullanılacağını anlamadı , bunun yerine kodu derinlemesine derleyiciler tarafından kırılan programcıların derleyicilere "teşekkür" etmeleri gerektiğini savunuyorlar. onlara kodlarının "kusurlu" olduğunu göstermek - aksi takdirde, bu tür kuralları zorlayan kişilere, Standardın minimum gereksinimlerinin ötesinde örtüşme işlemini desteklemeyi reddetmenin derleyicileri bazı amaçlar için uygunsuz hale getireceğini ve düşük düzeyli kodun takma ad ihtiyacını açıklığa kavuşturmasını söyleyebilirdi. kusur değil.
supercat

@supercat Aslında takma ad kurallarının ne anlama geldiğini anlamadım, bana yardım edebilir misin?
Suraj Jain

1
Orijinal konsept, int i; int test(double *p) { i=1; *p=2.0; return i; }bir derleyici gibi verilen kodun , adresini tutabilecek kapalı şansa iyazma *pşansından sonra yeniden yüklenmesinin gerekmemesiydi . Tamamen makul. Sorun, modern derleyiciler bir yazma işlemleri bu varsayımları doğrulamak için aynı kuralı kullanmasıdır bir etkilemez , her iki tür aynı boyut ve temsil hakkına sahip olsa bile ve bu iki yapının Ortak Başlangıç Dizisi paylaşan bile, kod asla kullanımını bir CIS üyesini okumak için diğeri aracılığıyla yazılmış bir işaretçi. pilong*long long
supercat

-2

Bu soru net olarak tam olarak aranmadı, yine de şuna bakabilirsiniz:

  1. C, başlangıçta Dennis Ritchie tarafından 1969 ile 1973 yılları arasında AT&T Bell Labs'ta geliştirilen genel amaçlı bir programlama dilidir.
  2. C99, ISO tarafından yayınlanan ve ANSI tarafından 1999'da kabul edilen bir C dili standardıdır.
  3. GNU C sadece c89'un bir uzantısıdır, ancak c99'un bazı özellikleri de eklenir, ancak bütün olarak c99 standardından farklıdır, bu nedenle gcc'de derlerken -std=c99, diğer yanıtlarda daha önce bahsedileni girmemiz gerekir .
  4. ANSI C, ANSI tarafından yayınlanan ardışık bir standartlar dizisidir.

Şimdi net aradım. Soruyu düzenledim. Soruyu göndermeden önce C ve ANSI standartlarını biliyordum. Belirli şeylerle ilgili kafa karışıklığı yaşıyorum. Daha kesin olmaya çalışacağım.
Aseem Bansal

C99 katı hakkında herhangi bir şey ve kod kodundaki C'nin C89 mu yoksa daha önceki standartlaştırılmamış orijinal C
Aseem Bansal

4
Bu cevap birçok hata içeriyor. C99, ISO tarafından 1999 civarında tanımlanan bir standarttır. C dili, 23 yıldır uluslararası olarak standardize edilmiştir. Dolayısıyla ANSI'nin bununla hiçbir ilgisi yok, 24 yıldır bir C standardına dokunmadılar. Günümüzde sadece Amerikan pazarı için ISO standardını basmakta ve dağıtmaktadırlar.
Lundin

@Lundin Oh !! evet, aslında "tanımlanmış" yazdım, ki durum böyle değil, orada "benimsenmeli". Düzeltmeyi yaptım, ANSI 1989'da ISO tarafından benimsenen ilk C standardını yayınladı. bundan sonra neredeyse tüm standartlar ISO tarafından yayınlandı ve ANSI tarafından benimsendi ve cevap sorulduğu kadar kısa, bu yüzden cevabı kısa tutan birkaç şeyden söz ettim.
ondalık 0

1
Not olduğunu gccdestekler -std=c89ve -std=gnu89ve -std=c99ve -std=gnu99(ve modern yeterince versiyonları destekleyen -std=c11ve -std=gnu11). Aradaki fark, Standart C üzerindeki uzantıların otomatik olarak veya yalnızca kaynak derleyiciyi uygun makrolar (örneğin -D_XOPEN_SOURCE=700) sağlamaya teşvik ettiğinde kullanılabilir olmasıdır .
Jonathan Leffler
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.