imperativa tipo di base di enumerazione utilizzando pragma o il codice di cambiamento
Domanda
Problema:
Sto usando un grande C / C ++ base di codice che funziona su gcc e compilatori di Visual Studio, dove tipo di base enum è di default a 32 bit (tipo intero).
Questo codice ha anche un sacco di linea + montaggio integrato che tratta enum come tipo integer e di dati enum viene utilizzato come bandiere a 32 bit, in molti casi.
Quando compilato questo codice con ARM realview RVCT 2.2 del compilatore, abbiamo iniziato a ricevere molti problemi dal realview compilatore decide tipo di base enum automaticamente in base al valore di un enum è impostato. http://www.keil.com/support/man/docs/ armccref / armccref_Babjddhe.htm
Ad esempio,
Si consideri l'enum sotto,
enum Scale {
TimesOne, //0
TimesTwo, //1
TimesFour, //2
TimesEight, //3
};
Questa enum viene utilizzato come una bandiera a 32 bit. ma compilatore ottimizza al unsigned tipo char per questo enum.
Utilizzando l'opzione del compilatore --enum_is_int non è una buona soluzione per il nostro caso, dal momento che converte tutti gli enum di a 32-bit che romperà l'interazione con qualsiasi codice esterno compilato senza --enum_is_int.
Questa è allarme sono trovato in RVCT compilatori e guida Biblioteca,
L'opzione non è --enum_is_int raccomandato per l'uso generale e non è richiesto per sorgente compatibile con ISO. Il codice compilato con questa opzione non è compatibile con l'ABI per ARM Architettura (standard di base) [BSABI], e un uso non corretto potrebbe comportare una fallimento in fase di esecuzione. Questa opzione non è supportata dalle librerie del C ++.
Domanda
Come convertire tipo di base tutti gli enum (da cambiamenti codificati a mano) da usare a 32 bit senza intaccare il valore ordinazione?
enum Scale {
TimesOne=0x00000000,
TimesTwo, // 0x00000001
TimesFour, // 0x00000002
TimesEight, //0x00000003
};
Ho cercato il cambiamento di cui sopra. Ma compilatore ottimizza questo anche per la nostra sfortuna. : (
C'è un po 'di sintassi nel .NET come
enum Scala: int
E 'questo compilatore standard ARM e un ISO C ++ manca è?
Non c'è #pragma per controllare questo enum in ARM RVCT 2.2 del compilatore. C'è qualche pragma nascosto disponibili?
Soluzione
So che un sacco di finestre intestazioni utilizzare il seguente:
enum SOME_ENUM {
ONE = 1,
TWO = 2,
//...
FORCE_DWORD = 0x7FFFFFFF
};
Altri suggerimenti
In C ++ 11:
enum class Scale : uint32_t {
TimesOne, //0
TimesTwo, //1
TimesFour, //2
TimesEight, //3
};
Visual Studio 2012 e 4.4.6 gcc con l'-std = C ++ 0x opzione sia sostenere questo (le versioni precedenti possono pure.)