Pergunta

Problema:

Estou usando uma grande base de código C/C ++ que funciona nos compiladores GCC e Visual Studio, onde o tipo de base enum é por padrão de 32 bits (tipo inteiro).

Esse código também possui muitos montagem embutida em linha + que trata a enum como os dados do tipo inteiro e a enum é usada como sinalizadores de 32 bits em muitos casos.

Quando compilou esse código com o RealView Arm RVCT 2.2 Compiler, começamos a obter muitos problemas, já que o RealView Compiler decide o tipo de base de enum automaticamente com base no valor em que um enum está definido. http://www.keil.com/support/man/docs/armccref/armccref_babjddhe.htm

Por exemplo,

Considere a enum abaixo,

enum Scale {
    TimesOne, //0
    TimesTwo, //1
    TimesFour, //2
    TimesEight, //3
};

Esta enumeração é usada como um sinalizador de 32 bits. Mas o compilador o otimiza para o tipo de char não assinado para este enumeração.

Usar --enum_is_int Opção do compilador não é uma boa solução para o nosso caso, pois converte todos os enum em 32 bits, o que quebrará a interação com qualquer código externo compilado sem --enum_is_int.

Isso é aviso que encontrei no RVCT Compilers & Library Guide,

A opção --enum_is_int não é recomendada para uso geral e não é necessário para a fonte compatível com ISO. O código compilado com esta opção não é compatível com o ABI para a arquitetura do ARM (padrão base) [BSABI], e o uso incorreto pode resultar em uma falha no tempo de execução. Esta opção não é suportada pelas bibliotecas C ++.

Pergunta

Como converter o tipo de base de todos os enum (por alterações codificadas à mão) para usar de 32 bits sem afetar a ordem de valor?

enum Scale {
    TimesOne=0x00000000,
    TimesTwo, // 0x00000001
    TimesFour, // 0x00000002
    TimesEight, //0x00000003
};

Eu tentei a mudança acima. Mas o compilador otimiza isso também para nossa má sorte. :(

Há alguma sintaxe no .net como

escala enum: int

É um padrão ISO C ++ e o compilador de braço não possui?

Não há #Pragma para controlar esse enumeração no compilador de rvct 2.2 ARM. Existe algum Pragma oculto disponível?

Foi útil?

Solução

Eu sei que muitos cabeçalhos do Windows usam o seguinte:

enum SOME_ENUM {
    ONE = 1,
    TWO = 2,
    //...
    FORCE_DWORD = 0x7FFFFFFF
};

Outras dicas

Em C ++ 11:

enum class Scale : uint32_t {
   TimesOne, //0
   TimesTwo, //1
   TimesFour, //2
   TimesEight, //3
};

Visual Studio 2012 e GCC 4.4.6 com a opção -std = c ++ 0x Ambos suportam isso (as versões anteriores também podem.))

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top