imperativa tipo di base di enumerazione utilizzando pragma o il codice di cambiamento

StackOverflow https://stackoverflow.com/questions/2521200

  •  22-09-2019
  •  | 
  •  

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?

È stato utile?

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.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top