SORU
15 EKİM 2014, ÇARŞAMBA


Bildirim kullanarak "otomatik" maçı beton türü belirleyici kullanan dışarıdan bir beyan mı?

Aşağıdaki programı deneyin:

extern int x;
auto x = 42;
int main() { }

Çınlama 3.5 (live demo), 4.9 ve VS2013 yok GCC (live demo for the former) kabul eder. Kimin haklı olduğunu ve doğru davranış C standardında nerede?

CEVAP
15 EKİM 2014, ÇARŞAMBA


Şaşırtıcı derecede küçük bu konuda standart var. Redeclaration duysak ya:

[C 11: 3.1/1]: beyan (Madde 7) çeviri bir birim içine bir veya daha fazla isimleri tanıtmak ya da adları önceki beyanları ile tanıttı redeclare olabilir.[..]

autoyalnızca ilgili kısmını'anlambilim s:

[C 11: 7.1.6.4/3]: Aksi takdirde, bu değişkenin türü onun başlatıcısı birebir.[..]

(x tipi int olduğunu bize hatırlatan).

Bir değişken tüm beyanları ile aynı tip verilmelidir.

Tür Ayarlamalar sırasında typedefs (7.1.3) kendi tanımlarına göre değiştirilir (), Sonra [C 11: 3.5/10]:türleri tüm tanımlamalar belirli bir değişken veya işlev bakarak belirtilen özdeş olacaktırvarlığı veya büyük bir dizi bağlı olmaması (8.3.4) tarafından farklı nesne dizi türleri belirleyebilir bir dizi için bu tanımlamalar dışında. Kimlik türü bu kural ihlali bir tanı gerektirmez.

ve "tür Ayarlamalar" sorusu autoile ilgili karşılar'nin tüm bu katılım; benim yorumum o zaman . sonra ^strong>bu doğal olarak geçerli bir redeclaration (tanım) tipi ile genel kapsamlı Çınlama doğru olduğunu int ** * * 9*. Biz auto "tip ayar", tanısal bir yana, en kötü ihtimalle . gerekli sayılmaz o teklif bile ^em>tümlistelenen uygulamaları kendi şekilde uyumludur.

GCC ve Visual Studio gibi ilham alarak şu olduğuna inanıyorum:

[C 11: 7.1.6.4/5]: bir bağlam açıkça bu bölümde yasak auto kullanan Bir program kötü oluşur.

&üssün;ama bu dar görüşlü olduğunu düşünüyorum. Tekrarlanan veya açıkça 7.1.6.4 içinde bulunulan değildir çünkü standart dili her zamanki redeclaration kuralları yasaklamak için tasarlanmıştır Olası görünüyor.

C 14 ekler tanımlamalar ilişkili olduğunu ifadefonksiyonlarçıkarılabilir türleri:

Tutucu bir türü kullandığı bildirilen bir dönüş türü ile bir işlevi veya işlev şablonu [C 14: 7.1.6.4/13]: Redeclarations uzmanlık ya da yer tutucu, çıkarılabilir bir türü kullanmak zorundadır.[..]

Program reddederek simetri, int senin durumunda, amaçlanan olduğunu düşündürebilir GCC ve VS doğru. Ancak, bu farklı bir özelliği indirimi olamaz sadece bildirimleri için uygulanması beri) ve farklı bir senaryo işte.

Her iki şekilde de, geliştirilmiş standart ifadeler burada yardımcı olacaktır. [Makul] küçük editoryal bir kusur olarak görüyorum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Barnacules Nerdgasm

    Barnacules N

    20 Temmuz 2006
  • Watcher3223

    Watcher3223

    15 Kasım 2007
  • JeezyVEVO

    JeezyVEVO

    12 Mayıs 2009