2011-09-07 11 views
10

là kích thước của một enum luôn luôn giống nhau giữa các trình biên dịch khác nhau (gcc, c trực quan và những người khác?). Đó là, không sizeof() của một enum cụ thể cho các giá trị tương tự với mỗi trình biên dịch theo các tiêu chuẩn C/C++?Kích thước của enums theo byte của các trình biên dịch khác nhau

+0

Và sự ký kết cũng có thể khác nhau. –

Trả lời

14

số

Trong cả hai C và C++ một enum sẽ có một kích thước sao cho tất cả các giá trị có thể được biểu diễn và tương thích với một loại số nguyên. Các trình biên dịch khác nhau có thể sử dụng các thuật toán khác nhau để chọn loại (nếu nó không được chỉ định bởi một tiêu chuẩn khác như ABI được định nghĩa rõ ràng). (C++ 11 cho phép để xác định loại tiềm ẩn với một cú pháp mới)

+0

Không nhất thiết phải: C cho phép loại giá trị điều tra được trình biên dịch lựa chọn, giống như câu trả lời của bạn, thực hiện C++. Xem phần 6.7.2.2/4 trong [Tiêu chuẩn C] (http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf). – pmg

+0

Ngoài ra, trong C++ 0x bạn có thể sử dụng lớp * enum mới * để chỉ định kiểu số nguyên sẽ được sử dụng để trả về các giá trị đếm. –

+0

@pmg, cảm ơn. Tôi không biết tôi đã lấy cái đó ở đâu. Tôi đã kiểm tra nó đã được các trường hợp trong C90. – AProgrammer

2

"Mỗi loại được liệt kê phải tương thích với char, một loại nguyên ký , hoặc một loại unsigned integer. Sự lựa chọn kiểu là thực hiện được xác định) nhưng có khả năng đại diện cho các giá trị của tất cả các thành viên của điều tra. "

"... Việc triển khai có thể trì hoãn lựa chọn loại số nguyên cho đến khi tất cả các hằng số đếm đã được xem."

ISO/IEC 9899: 1999 (E) p.105

Vì vậy, chúng tôi chỉ có ranh giới trên cho sizeof (enum). Trên hầu hết các hệ thống tôi có sizeof (enum) = 4, nhưng trình biên dịch STM đã tạo sizeof (enum) = 1/2/4 tùy thuộc vào các giá trị được viết trong enum

Edit: có vẻ như bạn có thể đặt một trong các giá trị của enum max int để đảm bảo rằng trình biên dịch chọn số nguyên như kích thước enum.

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