2012-11-02 37 views
7

Có thể nhận giá trị của một thành viên enum tại thời gian biên dịch?Có thể nhận giá trị của một thành viên enum tại thời gian biên dịch?

Trong thực tế, tôi muốn để có thể làm điều gì đó như thế này:

enum { 
    FOO_FIRST = -1, 
    FOO_A, 
    FOO_B, 
    FOO_C, 
    FOO_LAST 
}; 

#if FOO_LAST > 10 
//... 
#else 
//.. 
#endif 

Tôi biết rằng cpp không biết về các biến, cú pháp xấu, vv; chỉ những thứ bắt đầu bằng # (phải)? nhưng các thành viên của một enum có kích thước cố định và không thể thay đổi giống như giá trị 10 (hằng số nguyên) và trình biên dịch biết kích thước và giá trị của nó. Vì vậy, không có bất kỳ khả năng để làm so sánh như vậy (như tôi đã làm ở trên)? gcc-extensions cũng rất được đánh giá cao.

nó chỉ là một cố gắng để không viết lại tất cả các liệt kê của tôi bằng cách sử dụng #define s và không dành thời gian của tôi làm một số thay đổi macro.

+1

Bạn đang cố gắng làm gì bên trong khối '# if'? – ecatmur

+0

không thể nghĩ ra bất kỳ trường hợp sử dụng thực tế nào trong trường hợp này hữu ích .. –

+0

[enum và #define] (http://stackoverflow.com/questions/136946/difference-between-enum-and-define-statements) – SparKot

Trả lời

7

Chỉ cần sử dụng if. Enums có thể được đánh giá tại thời gian biên dịch tốt. Trình biên dịch sẽ tối ưu hóa các chi nhánh không thể ra:

if (FOO_LAST > 10) { 
    // A 
} else { 
    // B 
} 

trình biên dịch biết nào trong hai chi nhánh (A và B) không thể đạt được, vì vậy nó có thể loại bỏ hoàn toàn if.

Lưu ý rằng bạn chỉ nên sử dụng trực tiếp các điều tra viên. Ví dụ, trong này:

int num = FOO_LAST; 
if (num > 10) { 
    // A 
} else { 
    // B 
} 

GCC sẽ giữ so sánh if.

+0

Rất đẹp. Tôi sẽ thử. Bạn có liên kết với các chi tiết tối ưu hóa như vậy không? (chúng ta đang nói về gcc?) – Jack

+1

Xem điều này để có được một ý tưởng: http://stackoverflow.com/questions/11281471/disable-if0-elimination-in-gcc Bạn thậm chí không cần phải kích hoạt trình tối ưu hóa để có được điều này hành vi. Biên dịch một chương trình ví dụ với '-O2 -S' để lấy tập tin lắp ráp. Bạn sẽ thấy rằng không có nhánh. –

+0

Cảm ơn bạn rất nhiều. Bạn đã cứu ngày của tôi. :) – Jack

3

#ifdef được diễn giải bởi bộ tiền xử lý chứ không phải bởi trình biên dịch. Bộ xử lý trước không biết gì về giá trị của enums. Vì vậy, đây không phải là một cách để đi.

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