2012-09-20 40 views
17

Đây có phải là C++ hợp pháp không?Bạn có thể sử dụng sizeof một thành viên khi khai báo một thành viên khác không?

struct foo 
{ 
    int a[100]; 
    int b[sizeof(a)/sizeof(a[0])]; 
}; 

GCC 4.6 chấp nhận, nhưng MSVC 2012 thì không. Có vẻ như nó sẽ ổn với tôi, nhưng một chút Googling đã không giúp đỡ và tôi không biết phải tìm kiếm tiêu chuẩn ở đâu.

MSVC 2012 cho kết quả như sau:

error C2327: 'foo::a' : is not a type name, static, or enumerator 
error C2065: 'a' : undeclared identifier 
error C2070: ''unknown-type'': illegal sizeof operand 
warning C4200: nonstandard extension used : zero-sized array in struct/union 
+0

thể trùng lặp của [Tại sao tôi không thể khởi tạo thành viên tĩnh không const hoặc mảng tĩnh trong lớp học?] (Http: // stackoverflow.com/questions/9656941/why-i-cant-initialize-non-const-static-member-or-static-array-in-class) –

+2

Ngay cả khi nguyên nhân cuối cùng là tương tự, câu hỏi có vẻ rất khác với tôi . – Gorpik

+2

Đoạn liên quan trong tiêu chuẩn C++ 11 là khoản 5, đoạn 8, tôi nghĩ vậy. – jrok

Trả lời

18

này là bất hợp pháp trong C++ 03 bởi vì những thành viên là datamembers không tĩnh.

Bắt đầu từ C++ 11 điều này là hợp pháp vì trong toán hạng chưa được đánh giá, bạn có thể sử dụng các trình dữ liệu không tĩnh mà không có đối tượng tương ứng.

1

Hãy thử điều này: Đây là giải pháp cho MSVC 2010 và MSVC 2012

struct Aoo 
{ 
    typedef int ArrayType; 
    ArrayType a[100]; 
}; 

struct foo : public Aoo 
{ 
    enum {bSize = sizeof(Aoo)/sizeof(Aoo::ArrayType)}; 
    int b[bSize]; 
}; 
Các vấn đề liên quan