Datenbreite eines enum?



  • Hi,

    ein enum ist - so weit ich weiß - immer ein 32 Bit Datentyp. Wie sieht das allerdings aus, wenn ich meinen C-Code mit einem 64 Bit Compiler übersetze? Wird enum dann auch 64 Bit breit? Bleibt er 32 Bit? Hängt das vom Compiler ab? Was sagt der Standard hier genau?



  • Haengt glaube vom Compiler ab. Der zugrunde liegende Typ kann aber spezifiziert werden.


  • Mod

    C++-Standard 7.2,6 schrieb:

    For an enumeration whose underlying type is not fixed, the underlying type is an integral type that can
    represent all the enumerator values defined in the enumeration. If no integral type can represent all the
    enumerator values, the enumeration is ill-formed. It is implementation-defined which integral type is used
    as the underlying type except that the underlying type shall not be larger than int unless the value of an
    enumerator cannot fit in an int or unsigned int.



  • Das wirft die zweite Frage auf: wie kann ich einen enum auf int (bzw. 32 Bit) zwingen?



  • WaHoooo schrieb:

    Das wirft die zweite Frage auf: wie kann ich einen enum auf int (bzw. 32 Bit) zwingen?

    Mit C++03 gar nicht direkt. Mit C++11 durch enum xy : unint32_t {...} .
    In C++03 kannst Du allerdings enum -> int32 -> enum casten.



  • Vielleicht gibt´s dafür einen Compilerschalter, ist dann aber natürlich compilerabhängig. Aber immerhin besser als nix. Beim Embarcadero Compilersimulator wäre das -b.



  • WaHoooo schrieb:

    Das wirft die zweite Frage auf: wie kann ich einen enum auf int (bzw. 32 Bit) zwingen?

    "kleinerzwingen", d.h. zwingen, dass die Größe maximal 32 bit sind, wird schwierig. Größerzwingen, d.h. dass die Größe minimal 32 bit ist, geht schon. Zusätzlich könntest du mit static_assert noch hinbekommen, dass es Compilerfehler gibt, falls die Größe von 32 bit abweicht:

    enum MyEnum
    {
      A, B, C, //deine enum-member...
    
      BLOW_UP_TO_32_BIT = 1<<31
    };
    
    static_assert(sizeof(MyEnum) == 4, "Enum size must be 32 bit!");
    

Anmelden zum Antworten