2009-03-29 59 views
11

biên dịch với gcc C99typedef enum, xác định giá trị trong phạm vi

Tôi đã sử dụng enums một thời gian rồi. Tuy nhiên, tôi đang sử dụng một số mã mẫu để phát triển ứng dụng của mình. Và tôi đã bắt gặp một số mã như thế này. Tôi đã được thông báo rằng đây là cách sử dụng thực hành tốt nhất khi sử dụng enums. Nhưng tôi không thấy điều này có lợi thế gì.

typedef enum { 
    TYPE_DATE, 
    TYPE_TIME, 
    TYPE_MONEY, 

    TYPE_COUNT, 
    TYPE_UNKNOWN = TYPE_COUNT 
} string_type_e; 

Tại sao có và tại sao TYPE_COUNT gán TYPE_COUNT-TYPE_UNKNOWN?

Rất cám ơn mọi đề xuất,

Trả lời

17

Theo mặc định, enums được tự động cung cấp giá trị số nguyên bắt đầu từ 0 bởi trình biên dịch. Vì vậy, ngày sẽ bằng không, thời gian một và tiền hai. Giá trị tiếp theo được gán cho giá trị enum 'psuedo' TYPE_COUNT, giá trị này sẽ nhận được giá trị ba, điều này xảy ra là số lượng giá trị enum 'thích hợp'.

TYPE_UNKNOWN là một giá trị khác đại diện cho thứ gì đó không phải là giá trị 'thích hợp', do đó sẽ không thể kiểm tra e < TYPE_COUNT. Có nó bằng TYPE_COUNT có nghĩa là mỗi giá trị có ý nghĩa riêng biệt là tiếp giáp nhau, nhưng tôi không biết về bất kỳ lợi thế đáng kể nào (có thể là nếu TYPE_COUNT là ít hơn một công suất 2, có thể ảnh hưởng đến trình bày của trình biên dịch nào , và nó 'đẹp' để có các giá trị tiếp giáp, nhưng nó không thực sự quan trọng, như bạn sẽ không tăng chúng qua TYPE_COUNT anyway)

+0

Tôi có thể gán các giá trị như 0x2 và 0xfffe cho các hằng số được đặt tên trong một enum không? – Namratha

+1

@Namratha bạn có thể, và nó là khá phổ biến, nơi họ là một số giao thức, nơi các giá trị được cố định như là một phần của giao diện với một thành phần khác.Trong những trường hợp như vậy, có thể bạn sẽ không sử dụng thứ gì đó giống như 'TYPE_COUNT' ở cuối, trừ khi các giá trị tiếp giáp với nhau, bạn sẽ không tính đến chúng. –

6

Giá trị enum về cơ bản là hằng số nguyên. Theo mặc định, chúng được gán giá trị của phần tử cuối cùng trong enum + 1 (và 0 cho phần tử đầu tiên). Khi bạn muốn đếm các phần tử, có thể hữu ích khi ánh xạ nó với một mảng hoặc một thứ gì đó, của enum được khai báo như vậy (sẽ được cập nhật động nếu bạn thêm hoặc loại bỏ thứ gì đó), bạn có thể đặt COUNT hằng số tại kết thúc của nó (TYPE_COUNT trong ví dụ của bạn). Để có thể phân biệt các giá trị không hợp lệ trong enum, bạn có thể muốn khai báo một hằng số khác. Trong ví dụ của bạn, hằng số đó sẽ bằng hằng số đếm, đó là một giá trị lớn hơn giá trị lớn nhất của enum của bạn.

3

Tại sao có type_count và tại sao chỉ định type_count cho type_unknown?

Để giữ tab trên giá trị tối đa được phép cho số enum. Hãy nhớ rằng, nếu không thì không có cách nào để kiểm tra xem một giá trị đã cho có đúng hay không (trong phạm vi) hay không.

+0

Nhưng có thể có khoảng trống và chồng chéo trong phạm vi của một enum - không phải trong ví dụ, để chắc chắn, nhưng trong enums nói chung. –

+0

@ Jonathan: Nếu tác giả đã thiết kế một enum với khoảng trống trong trình tự cơ bản, thì phương pháp xác định hằng số đếm này sẽ vô ích. Vì vậy, một tác giả mong muốn cái sau sẽ tránh cái cũ - đơn giản như thế. – Shog9

2

TYPE_COUNT có thể phục vụ để định kích thước một mảng lập chỉ mục bởi các yếu tố của enum:

type_info my_info[TYPE_COUNT]; 

hoặc có thể được sử dụng trong điều kiện thoát của vòng lặp for. TYPE_UNKNOWN có thể được sử dụng để thể hiện một giá trị bất hợp pháp hoặc không xác định cho loại (-1 có thể là một thay thế cho TYPE_COUNT cho giá trị của nó).

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