Soru 'int [0]' c ++ için çok fazla başlatıcı var


İlk:

int k[] ={1,2,3,4,5};

İkinci:

struct slk
{
    int k[] ={1,2,3,4,5};
};

Bu iki ifade için, neden birincisi derlemeyi geçiyor ama ikincisi bana veriyor

hata: 'int [0]' için çok fazla başlatıcı. k [5] 'i ayarlarsam derleme geçecekti;

Bu hata mesajı ne anlama geliyor? Not: GNU GCC sürüm 4.7.2'de test edilen kod


21
2018-01-16 02:10


Menşei


Üyeler için satır içi başlatma, tamamen farklı bir ballgame. İlk örneğinizin doğrudan eşdeğerini almak için, üyelerinizi bir üye başlatma listesi (İkinci örneğinizde yaptığınız gibi satır içi yapabileceğiniz sınırlı durumlar olsa da). - Lightness Races in Orbit
İle çalışmak gibi görünüyor int k[5] = {1,2,3,4,5}; ama nedenini açıklayamıyorum. - ValarDohaeris
@ValarDohaeris, Daha çok "bir sınıfta bunu yapmak için bir boyu olmalı". IIRC, standardın açık bir kuralı vardır. - chris


Cevaplar:


C ++ 11'de, sınıf içi üye başlatıcılara izin verilir, ancak temel olarak, bir üye başlatma listesindeki başlatma ile aynı davranır. Bu nedenle, dizinin boyutu açıkça belirtilmelidir.

Stroustrup web sitesinde kısa bir açıklama var İşte.

Hata mesajı, bir dizi uzunluk 0 için çok fazla öğe sağladığınız anlamına gelir; int [] bu bağlamda değerlendirir.


24
2018-01-16 02:21





İlk örnekte, bir şey (gerçek bellek ayırma) aslında oluyor. Bilgisayar, kendisine verilen öğelerin sayısını kolayca hesaplar ve bunu kapasite olarak kullanır. İkinci kullanımda, bir yapının parçası olarak, dizi sadece bir şablonun şablonunun parçasıdır. İkinci durumda, derleme zamanında bir boyut açıkça verilmeli ve bilinmelidir. Burada otomatik sayım yok. Açıklamalara karşı, deklarasyonların yanı sıra, değişken bildirimleri de (işlev türü ancak belleğe dokunulmamış) ve bunların çağrılmasına / kullanılmasına (programın hareket ettiği yere) benzer bir damardadır.


3
2018-01-16 02:41



Onu aptal buluyorum. Özdeş yapı ve derleyici, bir örnekte boyutu diğer tarafa değil de boyutuna çıkarabilir. Bu ne kadar tutarsız? - There is nothing we can do


Muhtemelen bir neden struct Derleyicinin boyutu açıkça belirtmeniz gerekiyor.

C yapı içindeki diziyi başlatır (amaçlanan)


1
2018-01-16 02:20





Bunlar tamamen farklı iki bağlamdır:

Birincisi, değişken bir bildiridir (bir başlatıcı maddeyle).

İkincisi bir tür tanımdır.


1
2018-01-16 02:23