2012-11-02 12 views
7

È possibile ottenere un valore di un membro enum in fase di compilazione?È possibile ottenere un valore di un membro enum in fase di compilazione?

In realtà, voglio essere in grado di fare qualcosa del genere:

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

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

So che il cpp non conoscono le variabili, la sintassi male, ecc; solo cose che iniziano con un # (a destra)? ma i membri di un enum hanno dimensione fissa e non possono essere modificati come il valore 10 (numero intero costante) e il compilatore ne conosce le dimensioni e i valori. quindi, non c'è alcuna possibilità di fare un tale confronto (come ho fatto sopra)? anche le estensioni gcc sono molto apprezzate.

è solo un tentativo di non riscrivere tutte le mie enumerazioni utilizzando #define s e non mi prendo del tempo facendo alcune modifiche alle macro.

+1

Che cosa stai cercando di fare all'interno dei blocchi '# if'? – ecatmur

+0

non può pensare a un caso di utilizzo effettivo in cui questo è utile .. –

+0

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

risposta

7

Basta usare if. Le enumerazioni possono essere valutate al momento della compilazione bene. Il compilatore di ottimizzare i rami impossibili out:

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

il compilatore sa quale dei due rami (A e B) non può essere raggiunto, in modo che possa eliminare la if completamente.

Nota, tuttavia, è necessario utilizzare gli enumeratori solo direttamente. Ad esempio, in questo:

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

GCC sarà mantenere il confronto if.

+0

Molto bello. Lo proverò. Hai un collegamento con questi dettagli di ottimizzazione? (stiamo parlando di gcc?) – Jack

+1

Vedere questo per avere un'idea: http://stackoverflow.com/questions/11281471/disable-if0-elimination-in-gcc Non è nemmeno necessario abilitare l'ottimizzatore per ottenere questo comportamento. Compilare un programma di esempio con '-O2 -S' per ottenere il file assembly. Vedrai che non ci sono ramificazioni. –

+0

Grazie mille. Mi hai salvato la giornata. :) – Jack

3

#ifdef viene interpretato dal preprocessore e non dal compilatore. Il pre-processore non sa nulla dei valori di enums. Quindi questa non è una strada da percorrere.

Problemi correlati