typedef Konflikt



  • Guten Morgen zusammen.

    Habe folgendes Problem:

    Ich binde in meine Win32 Anwendung unter MS VC++ eine API ein.
    Im Headerfile "fgcamera.h" wird eine "basetype.h" inkludiert.
    In der "basetype.h" ist der Datentyp UINT32 als unsigned long definiert.

    #ifndef UINT32
    #define UINT32 unsigned long
    #endif
    

    Wenn ich dass nun kompilieren will gibt es Fehlermeldungen, weil UINT32 bereits in der "BASETSD.H" definiert ist, die automatisch mit eingebunden wird.

    typedef unsigned int UINT32, *PUINT32;
    

    Aber ich kann/will die "basetype.h" der API, die ich benutze nicht ändern.

    Gibt es ne Möglichkeit dieses Problem zu umgehen?

    Grüße,
    DarthZiu



  • Du solltest dich entscheiden, ob du den Typ per #define oder per typedef definieren willst (typedef ist imoh sinnvoller) - durch das Makro versaust du dir den nachfolgenden Code:

    //so sieht dein typedef aus, nachdem der Präprozessor drübergegangen ist:
    typedef unsigned int unsigned int, *PUINT32;
    

    (erkennst du den Punkt, über den dein Compiler stolpert?

    PS: Ist der Code von dir oder von einem Fremdanbieter? Im ersten Fall solltest du dir mal Gedanken über dein Design machen.



  • CStoll schrieb:

    PS: Ist der Code von dir oder von einem Fremdanbieter? Im ersten Fall solltest du dir mal Gedanken über dein Design machen.

    Das ist ja das Problem. Der Code ist von einem Fremdanbieter und ich will die Headerdatei nicht manuell ändern. Wenn dann die nächste Version davon eingebunden werden soll muss man ja wieder diese Ecke "von Hand" entfernen.



  • DarthZiu schrieb:

    CStoll schrieb:

    PS: Ist der Code von dir oder von einem Fremdanbieter? Im ersten Fall solltest du dir mal Gedanken über dein Design machen.

    Das ist ja das Problem. Der Code ist von einem Fremdanbieter und ich will die Headerdatei nicht manuell ändern.

    Beide Fragmente (bei der Inkompatiblität gehe ich mal davon aus, daß sie n icht vom selben Autor stammen)? Zur Not könntest du ja vor deinem typedef den #define entschärfen oder es in ein eigenes #ifndef einkapseln:

    //Version 1:
    #undef UINT32
    typedef unsigned int UINT32,*PUINT32;
    
    //Version 2:
    #ifdef UINT32
    typedef unsigned int* PUINT32;
    #else
    typedef unsigned int UINT32,*PUINT32;
    #endif
    


  • Die "BASETSD.H" binde ich gar nicht ein. Das macht VC++. Die liegt in "vc98\include\basetsd.h".

    Der andere Header "basetype.h" ist von nem Fremdanbieter.

    Beide kann/will ich nicht ändern. Also muss ich dass irgendwie in meinem Code steuern. Oder gibts ne Möglichkeit den VC++ Header nicht einzubinden?



  • es gibt gerne ärger bei der reihenfolge der microsoft-headers.
    inkludier mal in deiner cpp-datei zuallererst die <windows.h>
    geht dann?



  • Danke, so scheint es zu klappen. Solche Fehler nerven wirklich!


Log in to reply