-ansi
30 yaşındaki göre derlemek için derleyici istekleri eski bir anahtardır C standardının eskimiş revizyonu , 1990: ISO / IEC 9899 , esasen ANSI standardı bir rebranding olan Dil C Programlama X3.159-1989" . Neden eskimiş? Çünkü C90 ISO tarafından yayınlandıktan sonra ISO, C standardizasyonundan sorumluydu ve C90'a yönelik herhangi bir teknik onay ISO tarafından yayınlandı -std=c90
.
Bu anahtar olmadan, son GCC C derleyicileri ISO / IEC 9899: 2011'de standartlaştırılmış C diline veya en yeni 2018 revizyonuna uyacaktır .
Ne yazık ki, standartlaştırma belgesinin standart kuruluşlardan bile bulunmadığı eski bir standart revizyona bağlı kalmanın kabul edilebilir olduğuna inanan bazı tembel derleyici satıcıları var.
Anahtarın kullanılması, kodun bu eski derleyicilerde derlenmesini sağlamaya yardımcı olur.
-pedantic
İlginç bir tanesidir. Yokluğunda -pedantic
spesifik standart istendiğinde bile, GCC yine Cı standart olarak kabul edilebilir olmayan bazı uzantılar sağlayacaktır. Örneğin programı düşünün
struct test {
int zero_size_array[0];
};
C11 taslak n1570 paragraf 6.7.6.2p1 diyor :
İsteğe bağlı tür niteleyicilerine ve statik anahtar sözcüğüne ek olarak, [ve] bir ifadeyi veya * sınırlayabilir. Bir ifadeyi (bir dizinin boyutunu belirten) sınırlarlarsa, ifade bir tamsayı türüne sahip olacaktır. İfade sabit bir ifadeyse, sıfırdan büyük bir değere sahip olacaktır. [...]
C standardı, dizi uzunluğunun sıfırdan büyük olmasını gerektirir; ve bu paragraf kısıtlamalar içerisindedir ; standart şu 5.1.1.3p1 diyor :
Bir önişleme çeviri birimi veya çeviri birimi, herhangi bir sözdizimi kuralının veya kısıtlamasının ihlali içeriyorsa, davranış açıkça tanımsız veya uygulama olarak belirtilmiş olsa bile, uygun bir uygulama (uygulama tanımlı bir şekilde tanımlanır) tanımladı. Tanılama mesajlarının başka durumlarda üretilmesine gerek yoktur.9)
Ancak, programı derlerseniz, gcc -c -std=c90 pedantic_test.c
uyarı yapılmaz.
-pedantic
derleyicinin aslında C standardına uymasını sağlar ; şimdi standardın gerektirdiği gibi bir teşhis mesajı üretecektir:
gcc -c -pedantic -std=c90 pedantic_test.c
pedantic_test.c:2:9: warning: ISO C forbids zero-size array ‘zero_size_array’ [-Wpedantic]
int zero_size_array[0];
^~~~~~~~~~~~~~~
Bu nedenle, maksimum taşınabilirlik için standart revizyonu belirtmek yeterli değildir, ayrıca GCC'nin standardın harfine gerçekten uyduğundan emin olmak için -pedantic
(veya -pedantic-errors
) kullanmanız gerekir .
Sorunun son kısmı C ++-ansi
ile kullanmaktı . ANSI hiçbir zaman C ++ dilini standartlaştırmamıştı - sadece ISO'dan benimsediğinden, bu, "Fransa tarafından standartlaştırılmış İngilizce" demek kadar mantıklı. Bununla birlikte, GCC hala C ++ için, aptalca göründüğü gibi kabul ediyor gibi görünüyor.