2013-10-02 10 views
6

C'è un modo per inibire l'espansione delle macro del preprocessore? Ho un file di intestazione C esistente che utilizza #define per definire un insieme di numeri interi e vorrei copiarlo in un enumerato C++ con gli stessi nomi di valori. Ad esempio (usando C++ 11):Blocco dell'espansione macro

enum MyEnum { 
    VALUE, 
    // ... 
}; 

#define VALUE 0 

MyEnum convert(int x) { 
    if (x == VALUE) { 
    return MyEnum::VALUE; 
    } 
    // ... 
} 

Il problema naturalmente è che MyEnum::VALUE viene tradotta a MyEnum::0, che causa un errore di sintassi. La soluzione migliore è sostituire le macro con le enumerazioni, ma sfortunatamente non è un'opzione nella mia situazione.

Ho tentato di utilizzare la concatenazione, ma ciò non ha aiutato (il compilatore ha dato lo stesso errore).

#define CONCAT(a,b) a##b 
// ... 
return MyEnum::CONCAT(VA,LUE); // still results in MyEnum::0 

C'è un'altra soluzione che mi consente di avere lo stesso nome per la macro e per il valore enum?

+0

La convenzione di vecchia data è che TUTTO MAIUSCOLO viene utilizzato per macro e tutto il resto utilizza almeno una lettera minuscola. Cioè 'enum MyEnum {Valore}'. – MSalters

risposta

3

È possibile ridefinisca una macro:

#undef VALUE 

dopo inclusa l'intestazione.

+2

Si noti che ciò renderà la macro non definita per il resto del file, quindi se la macro deve essere utilizzata in un secondo momento nel sorgente, deve essere ridefinita. –

+0

corretto. Questa soluzione non funziona. –