Korumam gereken bir projede tuhaf görünen bir kod parçası buldum. Derleyici hatasına yol açmayan bir sınıfın boş bir dizi üyesi var. Ben MSVC 10.0 ile böyle bir kod bazı varyasyonlarını test ettik: int i[]
deBoş dizi bildirimi - garip derleyici davranışı
template<class T> struct A {
int i[];
}; // warning C4200: nonstandard extension used : zero-sized array in struct/union
template<class T> struct B { static int i[]; };
template<class T> int B<T>::i[];
struct C {
int i[];
}; //warning C4200: nonstandard extension used : zero-sized array in struct/union
template<class T> struct D { static int i[]; };
template<class T> int D<T>::i[4];
template<> int D<int>::i[] = { 1 };
int main()
{
A<void> a;
B<void> b;
C c;
D<void> d0;
D<int> d1;
a.i[0] = 0; // warning C4739: reference to variable 'a' exceeds its storage space
b.i[0] = 0; // warning C4789: destination of memory copy is too small
c.i[0] = 0; // warning C4739: reference to variable 'c' exceeds its storage space
int i[]; // error C2133: 'i' : unknown size
d0.i[0] = 0; // ok
d0.i[1] = 0; // ok
return 0;
}
hata mesajı bana kesinlikle mantıklı. D
sınıfı ile gösterilen kod, iyi oluşturulmuş standart C++'dur. Ancak A
, B
vesınıflarına ne dersiniz? Bu sınıflarda üye değişkeni int i[]
ne tür?
Soru şu: Hatalar yerine (A ',' B' ve 'C' sınıfları uyarıları ile ilgili uyarılar neden)? Benim görüşüme göre bu, yerel değişkenin beyanı üzerine aldığım hata ile kıyaslandığında asimetriktir. – 0xbadf00d
Düzenlememe bakın, lütfen. – sergio
Teşekkürler, C++ standardına başka bir "güzel" Microsoft Eklentisi ... – 0xbadf00d