Bu hem bir cevap hem de Hayır'a genişletilmiş bir yorumdur , bu 1999'dan beri yasal C değildir. Hiçbir düzgün modern C derleyicisi buna izin vermez.
Evet, auto a=1;
C1999'da (ve ayrıca C2011'de) yasa dışıdır. Bunun artık yasadışı olması, modern bir C derleyicisinin bu tür yapıları içeren kodu reddetmesi gerektiği anlamına gelmez. Tam tersini, iyi bir modern C derleyicisinin buna hala izin vermesi gerektiğini iddia ediyorum.
Hem clang hem de gcc, sorudaki örnek kodu standardın 1999 veya 2011 sürümlerine göre derlerken bunu yapar. Her iki derleyici de bir tanılama yayınlar ve sonra sanki sakıncalı ifade öyleymiş gibi devam eder auto int a=1;
.
Bence iyi bir derleyicinin yapması gereken bu. Bir tanılama yayınlayarak, clang ve gcc standartla tam uyumludur. Standart, bir derleyicinin yasadışı kodu reddetmesi gerektiğini söylemez. Standart sadece, bir çeviri birimi herhangi bir sözdizimi kuralı veya kısıtlamasının (5.1.1.3) ihlalini içeriyorsa, uyumlu bir uygulamanın en az bir teşhis mesajı üretmesi gerektiğini söyler.
Yasadışı yapılar içeren kod verildiğinde, herhangi bir düzgün derleyici, derleyicinin koddaki bir sonraki hatayı bulabilmesi için yasa dışı kodu anlamaya çalışacaktır. İlk hatada duran bir derleyici çok iyi bir derleyici değildir. Bir anlam ifade etmenin bir yolu var, auto a=1
"örtük int" kuralını uygulamak. Bu kural, derleyiciyi , derleyici C90 veya K&R modunda kullanıldığı zamanki auto a=1
gibi yorumlamaya zorlar auto int a=1
.
Çoğu derleyici tipik olarak yasadışı sözdizimi içeren kodu reddeder (reddetme: bir nesne dosyası veya bir yürütülebilir dosya oluşturmayı reddetme). Bu, derleyici yazarlarının derleme başarısızlığının en iyi seçenek olmadığına karar verdiği bir durumdur. Yapılacak en iyi şey, bir teşhis yapmak, kodu düzeltmek ve devam etmektir. Gibi yapılarla dolu çok fazla eski kod var register a=1;
. Derleyici bu kodu C99 veya C11 modunda derleyebilmelidir (tabii ki bir tanılama ile).
int
1999'da C standardından kaldırıldı.