2012-05-20 74 views
6

Một mảng ký tự được xác định trên toàn cầu và một cấu trúc có cùng tên được xác định trong một hàm. Tại sao toán tử sizeof trả về các giá trị khác nhau cho c & C++?trả về các giá trị khác nhau cho c & C++?

char S[13]; 
void fun() 
{ 
    struct S 
    { 
     int v; 
    }; 
    int v1 = sizeof(S); 
} 

// returns 4 trong C++ và 13 trong C

+0

@OliCharlesworth: Biên dịch tốt trên trình biên dịch của tôi – Ashwyn

+0

@Ashwyn - trình biên dịch của bạn biên dịch mà không có '; 'sau khi' struct S'' s tuyên bố? – birryree

+0

@OliCharlesworth: Rất tiếc! quên viết rằng, thực sự tôi đã viết mã đó, thay vì dán bản sao! – Ashwyn

Trả lời

15

Vì trong C++, struct bạn đã xác định có tên là S, trong khi ở C, tên là struct S (đó là lý do bạn thường thấy typedef struct được sử dụng trong mã C). kết quả nếu bạn đã thay đổi mã để điều sau đây, bạn sẽ nhận được số dự kiến:

char S[13]; 
void fun() 
{ 
    typedef struct tagS 
    { 
     int v; 
    } S; 
    int v1 = sizeof(S); 
} 
+1

Bạn nên sử dụng các tên bắt đầu bằng dấu gạch dưới theo sau là một chữ cái viết hoa, vì những tên đó là [reserved] (http://stackoverflow.com/questions/228783/) để thực hiện. – fredoverflow

+0

Đủ công bằng. Sửa đổi một chút (không phải là nó quan trọng rất nhiều vì lợi ích của ví dụ.) –

10

Trong C, để chỉ kiểu struct, bạn cần phải nói struct S. Do đó, sizeof(S) đề cập đến mảng.

Trong C++, struct là không cần thiết. Vì vậy, địa phương S ẩn toàn cầu S.

Các vấn đề liên quan