Datentypen Aix xlC Compiler



  • Hallo!

    Ich habe ein Programm, das sowohl unter Windows ( Compiler Visual C++ 6.0) als auch unter Unix/Aix (Compiler xlC) laufen soll.
    Um die Datatypen compatible zu haben, habe ich folgende typedefs gemacht:

    #if defined SYSTEM_IS_WINDOWS
    
    	typedef double r64  ;
    	typedef float  r32  ;
    
    	typedef int i32  ; 
    	typedef unsigned int ui32 ;
    
    	typedef short i16 ;
    	typedef unsigned short ui16 ;
    
    	typedef char i8 ;
    	typedef unsigned char ui8 ;
    
    	typedef ui32 b32  ;
    	typedef ui16 b16 ;
    	typedef ui8  b8 ;
    
    #elif defined SYSTEM_IS_UNIX
    
    	typedef double r64  ;
    	typedef float r32  ;
    
    	typedef int i32  ; 
    	typedef unsigned int ui32 ;
    
    	typedef short i16 ;
    	typedef unsigned short ui16 ;
    
    	typedef char i8 ;
    	typedef unsigned char ui8 ;
    
    	typedef ui32 b32  ;
    	typedef ui16 b16 ;
    	typedef ui8  b8 ;
    
    #endif // #if defined SYSTEM_IS_WINDOWS
    

    Jetzt ist es aber so, dass einige Werte unterschiedlich berechnet werden. Ich vermute, dass die typedefs für Unix falsch sind. Kann mir jemand sagen, ob die typen für Windows und Unix einander so entsprechen?

    Danke.



  • Öhm, deine beiden Blöcke sind doch identisch... wozu die Unterscheidung?

    EDIT:
    Schau dir mal den Header <stdint.h> an. Da gibt es Typen wie int8_t, int16_t etc. Die sollten schon alle gleich sein.



  • Ich würde auch empfehlen, soweit möglich die Typedefs aus <stdint.h> (bzw. <cstdint>) zu benutzen.

    Davon mal abgesehen halte ich diese Unterscheidung zwischen Windows und Unix für problematisch. Die Datentypen mögen für ein bestimmtes Unix-System (AIX) und einen bestimmten Compiler (xlc) richtig sein, aber es gibt ja noch andere Unices und andere Compiler.



  • Ja, die beiden Blöcke sind identisch. In Wirklichkeit sind da noch mehr, für wieder andere Compiler und Computer. Aber die funktioneren alle.

    Dieses Programm soll nicht frei verkauft werden oder so. Es soll hier bei uns auf bestimmten Maschinen laufen, die alle bekannt sind, und mit bestimmten Compilern kompiliert werden, die bekannt sind. Dass es jetzt nur eine "Abteilung" Unix gibt, liegt daran, dass es im Moment nur eine Unix-Machine gibt, auf der es laufen soll.

    Meine Intention bei diesen typedefs war ja, dass im Code immer nur der Typ z.B. i32 benutzt wird und für jede Machine/Compiler dann sichergestellt ist, dass ein 32-bit integer behandelt wird. Wenn also jetzt eine zusätzliche Machine/Compiler kommt, wird dafür so ein typedef-Block geschrieben und am Code selbst braucht nichts geändert zu werden.

    Naja, ich werd einfach auf den warten, der es wissen müsste, sich jetzt aber unter südlicher Sonne aalt.



  • kannmichnichterinnern schrieb:

    Ja, die beiden Blöcke sind identisch. In Wirklichkeit sind da noch mehr, für wieder andere Compiler und Computer. Aber die funktioneren alle.

    Aha. Und was spricht gegen Folgendes?

    #if defined(SYSTEM_IS_WINDOWS) || defined(SYSTEM_IS_UNIX)
    

    kannmichnichterinnern schrieb:

    Naja, ich werd einfach auf den warten, der es wissen müsste, sich jetzt aber unter südlicher Sonne aalt.

    Hast du den Tipp mit <stdint.h> überlesen?



  • Nexus schrieb:

    Und was spricht gegen Folgendes?

    #if defined(SYSTEM_IS_WINDOWS) || defined(SYSTEM_IS_UNIX)
    

    Es sieht ja so aus, als wären die Typen für Aix nicht identisch mit denen für Windows.

    Hast du den Tipp mit <stdint.h> überlesen?

    Hab ich, aber in Visual C++ finde ich nichts dazu und mit den Infos über den xlC komme ich auch nicht weiter. Ich werde warten. Trotzdem danke.



  • kannmichnichterinnern schrieb:

    Dieses Programm soll nicht frei verkauft werden oder so. Es soll hier bei uns auf bestimmten Maschinen laufen, die alle bekannt sind, und mit bestimmten Compilern kompiliert werden, die bekannt sind. Dass es jetzt nur eine "Abteilung" Unix gibt, liegt daran, dass es im Moment nur eine Unix-Machine gibt, auf der es laufen soll.

    Aber weißt du wirklich, wie lange das Programm noch benutzt wird, und ob nicht in der Zukunft noch andere (Unix-)Plattformen dazu kommen?

    Wenn du meinst, daß die Typedefs falsch sind, lass dir doch einfach mal die tatsächlichen Größen mit sizeof ausgeben. Oder benutze einfach den Standard-Header und gut ist.



  • kannmichnichterinnern schrieb:

    Hab ich, aber in Visual C++ finde ich nichts dazu

    http://msinttypes.googlecode.com/svn/trunk/stdint.h


Log in to reply