2011-03-19 38 views
17

C mã chokhông tương thích giữa C và C++

#include <stdio.h> 
int x = 14; 
size_t check() 
{ 
    struct x {}; 
    return sizeof(x); // which x 
} 
int main() 
{ 
    printf("%zu",check()); 
    return 0; 
} 

cho 4 như đầu ra trong C tình hình thực hiện 32 bit của tôi trong khi trong C++ mã

#include <iostream> 
int x = 14;  
size_t check() 
{ 
    struct x {}; 
    return sizeof(x); // which x  
} 
int main() 
{ 
    std::cout<< check(); 
    return 0; 
} 

đầu ra 1. Sự khác biệt Tại sao như vậy?

+1

Các bản sao có thể có: http://stackoverflow.com/questions/3451266/understanding-sizeofchar-in-32-bit-c-compilers http://stackoverflow.com/questions/119123/why-isnt-sizeof-for -a-struct-equal-to-the-sum-of-sizeof-of-each-thành viên – phooji

+2

@phooji: Không, đó không phải là một bản sao. –

+0

@ Saurabh: Bạn có thể đúng - các câu hỏi không bao gồm chính xác cùng một nền tảng, nhưng tôi nghĩ rằng câu trả lời là thích hợp (xem câu trả lời của Prasoon và cũng là bình luận của tôi cho câu trả lời của bạn). – phooji

Trả lời

25

Trong C++ khai báo lớp struct x {}; giới thiệu tên x vào phạm vi check và giấu x (trước đây là khai báo là int ở phạm vi tập tin) . Bạn nhận được 1 là đầu ra vì size of empty class cannot be zero in C++.

Trong C, khai báo phạm vi bên trong tên cấu trúc không bao giờ ẩn tên của đối tượng hoặc hàm trong phạm vi bên ngoài.Bạn cần sử dụng tên thẻ struct để tham chiếu đến tên tệp x (struct). Tuy nhiên, bạn không thể có một cấu trúc rỗng trong C là it violates the syntactical constraints on struct (tuy nhiên gcc hỗ trợ nó như là một phần mở rộng).

+3

+1, nhưng có lẽ một trong những nên nhấn mạnh thực tế là trong C + + 'struct x' chỉ ẩn biến vì' x' được khai báo trong phạm vi bên ngoài. Nếu họ được tuyên bố trong cùng một phạm vi họ sẽ hạnh phúc sống chung với nhau * và * hành vi của 'sizeof' sẽ giống như đối với C. –

7

Mã C cho bạn kích thước của biến toàn cầu 'x', trong khi mã C++ cho kích thước của cấu trúc rỗng. Để có được kích thước của struct x trong mã C, sử dụng sizeof (struct x)

+0

Bạn đúng về vấn đề phạm vi, nhưng đó không phải là toàn bộ câu chuyện. Đặc biệt, bây giờ câu hỏi trở thành: tại sao 'sizeof (struct x)' yield 0 trong phiên bản C :) – phooji

+0

+1 cho tốc độ. !! –

+0

@phooji: Cấu trúc rỗng trong C là một vi phạm ràng buộc. –

0

Trong C, tôi không nghĩ bạn có thể tham chiếu đến một loại (tức là struct x) trực tiếp chỉ sử dụng tên của nó. Bạn phải tạo một đối tượng thuộc loại đó và chạy sizeof trên đối tượng đó.

Trong C++, sizeof khi áp dụng cho tên loại trả về kích thước của bất kỳ đối tượng nào thuộc loại đó.

7

Trong C, các thẻ cấu trúc nằm trong một không gian tên riêng biệt và bạn phải sử dụng từ khóa struct để truy cập các tên trong đó. Đây là lý do mà thành phần "typedef struct {} x" rất phổ biến trong C - nó cho phép bạn về cơ bản quảng bá các tên struct đến không gian tên chung.

Trong C++, ngược lại, cấu trúc (và tất cả các tên khác) sống trong không gian tên xung quanh việc kê khai, chứ không phải là một không gian tên tag struct riêng biệt như trong C.

Như Saurabh nói, sử dụng sizeof (struct x) trong C, hoặc sử dụng thủ thuật typedef struct {} x để có được sizeof (x) để làm việc như trong C++. Là một phần thưởng thêm, chương trình C++ xuất ra 1 vì các đối tượng lớp bê tông phải có kích thước nonzero (để các đối tượng khác nhau phải có địa chỉ khác nhau), do đó trình biên dịch đã đệm cấu trúc với giá trị char ẩn danh.

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