sizeof(enum) == 1?



  • hi,

    wieso ist die groesse folgendes enums 1? ein enum ist doch vom typ int und sollte daher doch 4byte gross sein?

    typedef enum _PIPE_TYPE
    {
      EVENT_PIPE      = 0x00,
      READ_DATA_PIPE  = 0x01,
      WRITE_DATA_PIPE = 0x02,
      ALL_PIPE        = 0x03
    }
    PIPE_TYPE;
    


  • die passen alle in einen char. dein compiler darf das optimieren (muss es aber nicht).



  • bei mir ist es 4!

    #include "stdafx.h"
    #include <iostream>
    
    typedef enum _PIPE_TYPE 
    { 
      EVENT_PIPE      = 0x00, 
      READ_DATA_PIPE  = 0x01, 
      WRITE_DATA_PIPE = 0x02, 
      ALL_PIPE        = 0x03 
    } 
    PIPE_TYPE; 
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	PIPE_TYPE x;
    	std::cout << sizeof(x) << std::endl;
    	return 0;
    }
    


  • volkard schrieb:

    die passen alle in einen char. dein compiler darf das optimieren (muss es aber nicht).

    echt, und was wäre dann mit:

    typedef enum _PIPE_TYPE 
    { 
      EVENT_PIPE      = 0x00, 
      READ_DATA_PIPE  = 0x01, 
      WRITE_DATA_PIPE = 0x02, 
      ALL_PIPE        = 256 
    } 
    PIPE_TYPE;
    

    Passt dann nicht mehr in ein char. Schon schlau, so mancher Compiler 🙂



  • volkard schrieb:

    die passen alle in einen char. dein compiler darf das optimieren (muss es aber nicht).

    und wie schalte ich die optimierung fuer diesen fall aus`?



  • okay habe bei den compiler-optionen was gefunden:

    enums als int behandeln.



  • Nein, das ist auf jeden Fall nicht die Option, die Du willst.

    Damit erlaubst Du die Zuweisung eines beliebigen ints auf deinen enum (was sonst nur über einen cast geht). So trägst Du mal ganz schnell ungültige Werte in einen enum ein.

    Man sollte sich ganz einfach nicht darauf verlassen, welche Größe der enum hat - oder falls man es braucht, vorher nach int casten.



  • Einfach (von MS abgekuckt):

    enum myEnum
    {
        foo,
        bar,
        FORCE_DWORD = 2147483648
    };
    

    MfG SideWinder



  • SideWinder schrieb:

    Einfach (von MS abgekuckt):

    enum myEnum
    {
        foo,
        bar,
        FORCE_DWORD = 2147483648
    };
    

    MfG SideWinder

    bringt mir bei

    switch(x){
    case foo: f(); break;
    case bar: b(); break;
    }

    die compilerwarnung "nicht alle enum-werte abgedeckt, du hast bestimmt was vergessen". also diese warnung ausschalten? da der fehler viel häufiger ist als fehlzuweisungen aus einem int, würde ich doch die compileroption vorschlagen.



  • Enumerator schrieb:

    und wie schalte ich die optimierung fuer diesen fall aus`?

    warum eigentlich diese optimierung ausschalten??? hab ich noch nie gebraucht.

    kann es sein, daß du mit
    [cpp]

    typedef enum _PIPE_TYPE
    {
    EVENT_PIPE = 0x00,
    READ_DATA_PIPE = 0x01,
    WRITE_DATA_PIPE = 0x02,
    ALL_PIPE = 0x03
    }
    PIPE_TYPE;

    [/cpp]
    erstens C programmiert und in C++ eher

    enum PIPE_TYPE
    {
      EVENT_PIPE      = 0x00,
      READ_DATA_PIPE  = 0x01,
      WRITE_DATA_PIPE = 0x02,
      ALL_PIPE        = 0x03
    };
    

    meintest und zweitens sogar

    typedef int PIPE_TYPE;
    PIPE_TYPE const EVENT_PIPE=0;
    PIPE_TYPE const READ_DATA_PIPE=1;
    PIPE_TYPE const WRITE_DATA_PIPE=2;
    PIPE_TYPE const ALL_PIPE=3;
    

    meintest?



  • naja mit mir sizeof(PIPE_TYPE) == 1 liefert, schlaegt mein abfrage (DeviceIoControl) fehl, da dort eine groesse von 4 erwartet wird.

    worin liegt den der unterschied zwischen typedef enum _blah {} blah; und enum blah {};?

    ich meinte schon enum...

    http://www.osronline.com/ddkx/still/stifnc_1wo9.htm



  • @Enumerator: Das eine ist nunmal C und das andere C++.

    @volkard:
    Gibs doch zu, Warnungen hast du doch auch alle abgeschaltet *g*

    Seis drum, ich finde Compilerschalter zu compilerabhängig, genauso wie ich pragma once nicht mag. Außerdem haben sich die MS-Programmierer da sicherlich auch was dabei überlegt, deswegen nütze ich FORCE_DWORD. Wer mich eines besseren belehrt kann das ruhig tun. Aber bei einer switch-Abfraeg hab ich eigentlich noch nie Werte aus der Enumeration schlichtweg vergessen 😕

    MfG SideWinder



  • bin zu faul jetzt nachzugucken wer das geschreiben hat 😉 schrieb:

    wieso ist die groesse folgendes enums 1? ein enum ist doch vom typ int und sollte daher doch 4byte gross sein?

    nach C Standard sind Enumwerte int Werte - nach C++ Standard nicht - was da genau zutrifft sollte man einfach in der entsprechenden Norm nachschlagen

    mmh wenn es erwünscht ist kann ich mal die Seite abtippen die im C/C++ Kompendium von Dirk Louis steht - der erklärt das auch ganz nett (ist es erwünscht?)



  • Außerdem haben sich die MS-Programmierer da sicherlich auch was dabei überlegt, deswegen nütze ich FORCE_DWORD.

    diese argumente sind nicht mein niveau.



  • @vertexwahn
    siehe Standard 7.2.5

    The underlying type of an enumeration is an integral type that can represent all the enumerator values
    defined in the enumeration. It is implementationdefined
    which integral type is used as the underlying type
    for an enumeration 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. ...



  • also um ganz sicher zu gehen, alle enum durch unsigned long ersetzen?



  • Enumerator schrieb:

    also um ganz sicher zu gehen, alle enum durch unsigned long ersetzen?

    SideWinders methode ist genauso ganz sicher. und mit ihr mußt du am wenigsten ändern.


Anmelden zum Antworten