Trong C, một enum
hằng số là kiểu int
. Trong C ++, nó thuộc kiểu liệt kê.
enum en_e{
en_e_foo,
en_e_bar=UINT64_MAX,
};
Trong C, đây là một vi phạm ràng buộc , yêu cầu chẩn đoán ( nếu UINT64_MAX
vượt quá INT_MAX
, rất có thể xảy ra). Trình biên dịch AC có thể từ chối chương trình hoàn toàn hoặc nó có thể in cảnh báo và sau đó tạo một tệp thực thi có hành vi không được xác định. (Không rõ ràng 100% rằng một chương trình vi phạm một ràng buộc nhất thiết phải có hành vi không xác định, nhưng trong trường hợp này, tiêu chuẩn không cho biết hành vi đó là gì, vì vậy đó vẫn là hành vi không xác định.)
gcc 6.2 không cảnh báo về điều này. leng keng. Đây là một lỗi trong gcc; nó ngăn chặn không chính xác một số thông báo chẩn đoán khi macro từ các tiêu đề chuẩn được sử dụng. Cảm ơn Grzegorz Szpetkowski đã tìm thấy báo cáo lỗi: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71613
Trong C ++, mỗi kiểu liệt kê có một kiểu cơ bản , đó là một số kiểu số nguyên (không nhất thiết int
). Loại cơ bản này phải có thể đại diện cho tất cả các giá trị không đổi. Vì vậy, trong trường hợp này, cả hai en_e_foo
và en_e_bar
đều thuộc loại en_e
, phải rộng ít nhất 64 bit, ngay cả khi int
hẹp hơn.