2010-04-05 28 views

Trả lời

24

Một enum được đảm bảo được biểu diễn bằng số nguyên, nhưng loại thực tế (và ký của nó) phụ thuộc vào việc triển khai thực hiện.

Bạn có thể buộc một đếm được đại diện bởi một loại ký bằng cách đưa ra một trong những điều tra viên một giá trị âm:

enum SignedEnum { a = -1 }; 

Trong C++ 0x, loại cơ bản của một điều tra có thể được xác định một cách rõ ràng:

enum ShortEnum : short { a }; 

(C++ 0x cũng cho biết thêm hỗ trợ cho enumerations scoped)

để hoàn chỉnh, tôi sẽ thêm rằng trong C Lập trình Ngôn ngữ, lần thứ 2, các điều tra viên được quy định là có loại int (tr. 215). K & R không phải là tiêu chuẩn C, vì vậy nó không phải là tiêu chuẩn cho các trình biên dịch ISO C, nhưng nó không đạt tiêu chuẩn ISO C, do đó, nó ít nhất là thú vị từ một quan điểm lịch sử.

+1

Tính năng đăng nhập thực sự được sử dụng bởi gcc là gì? – osgx

+0

@osgx: Tôi đoán rằng nó sẽ phụ thuộc vào số lượng điều tra viên và phạm vi giá trị của chúng. Tôi thực sự không biết. –

+2

Chuẩn C cũng xác định rằng mỗi * hằng số liệt kê * có kiểu 'int'. Howeve, thuật ngữ "hằng số liệt kê" dùng để chỉ các hằng số giá trị được khai báo bên trong khối 'enum {}'. Biến có loại 'enum' có thể có bất kỳ loại số nguyên nào trong C, ví dụ: nó có thể là loại ngắn hơn 'int' nếu có thể đại diện cho tất cả các giá trị. (GCC, ví dụ, có một tùy chọn '-fshort-enums' để làm chính xác điều này.) – Arkku

0

Đây là một câu hỏi cũ ... nhưng tôi vừa phát hiện ra điều này:

typedef unsigned ENUMNAME; // this makes it unsigned in MSVC C 2015 
typedef enum {v0, v1, v2, v3} ENUMNAME; 

Bạn có thể sử dụng nó như một chỉ số unsigned 2-bit, ví dụ:

typedef struct { 
    ENUMNAME i:2; 
} STRUCTNAME; 

Đã thử nó trong GCC ARM - không hoạt động.
Ngoài ra, WinDbg hiển thị STRUCTNAME.i dưới dạng số, không phải là v0-v3.