2012-11-02 14 views
7

Możliwe jest uzyskanie wartości członka wyliczenia w czasie kompilacji?Czy można uzyskać wartość członka enum w czasie kompilacji?

W rzeczywistości, chcę być w stanie zrobić coś takiego:

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

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

wiem, że cpp nie wiem o zmiennych, złej składni, etc; tylko rzeczy zaczynające się od # (po prawej)? ale członkowie wyliczenia mają stałą wielkość i nie mogą być zmienione tak jak 10 (stała liczba całkowita), a kompilator zna jego wielkość i wartości. więc, czy nie ma żadnej możliwości takiego porównania (tak jak to zrobiłem powyżej)? gcc-extensions są również bardzo doceniane.

Jest to po prostu próba nie przepisywania wszystkich wyliczeń za pomocą #define s i nie spiesz się z niektórymi zmianami makr.

+1

Co próbujesz zrobić w swoich blokach "# if"? – ecatmur

+0

Nie można wymyślić żadnego rzeczywistego przypadku użycia, jeśli jest to przydatne. –

+0

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

Odpowiedz

7

Po prostu użyj if. Wyliczenia można oceniać w czasie kompilacji. Kompilator optymalizuje niemożliwego gałęzie się:

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

kompilator wie, który z dwóch oddziałów (A i B) nie może zostać osiągnięty, więc może całkowicie wyeliminować if.

Należy jednak pamiętać, że należy używać wyłącznie modułów wyliczających. Na przykład w ten sposób:

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

GCC będzie zachować porównanie if.

+0

Bardzo ładne. Spróbuję. Czy masz link z takimi szczegółami optymalizacji? (rozmawiamy o gcc?) – Jack

+1

Zobacz pomysł: http://stackoverflow.com/questions/11281471/disable-if0-elimination-in-gcc Nie musisz nawet włączać optymalizatora, aby to uzyskać zachowanie. Skompiluj przykładowy program za pomocą '-O2 -S', aby uzyskać plik zespołu. Zobaczysz, że nie ma rozgałęzień. –

+0

Dziękuję bardzo. Uratowałeś mi dzień. :) – Jack

3

#ifdef jest interpretowany przez preprocesor, a nie przez kompilator. Wstępny procesor nie wie nic o wartościach enums. Więc to nie jest droga.