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?
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