Einzelnen Beitrag anzeigen

Robotiker
(Gast)

n/a Beiträge
 
#2

AW: Typübersetzung C? <> Delphi

  Alt 28. Okt 2012, 09:15
Stimmt das denn nun so?
Äh, nein, das meiste ist entweder grob vereinfacht oder gar falsch.

Erstens mal, im ursprünglichen C, das ist immerhin schon 40 Jahre alt, gab es keinen Boolean Typ. Auch in den ersten C++ Versionen nicht. Daher dieses Chaos.

Mittlerweile gibt es in ISO-C und ISO-C++ solche Typen, das ist dann bool. Wie groß die sind, hängt wahrscheinlich vom Compiler und der Prozessorarchitektur ab. Ich gehe mal davon aus, dass der Standard irgendwas zur Konvertierbarkeit von int und bool sagt, ich habe aber keinen hier.
Tabellen wie diese hier sagen meist nichts über die Größe von bool:
http://en.cppreference.com/w/cpp/language/types
[Edit] In VC++ und dem C++ Builder gilt wohl sizeof(bool) == sizeof(char)[/Edit]

Zweitens, per Konvention, sind GROSS geschriebenen Sachen entweder Makros (#define) oder typedefs.

Die WinApi stammt auch noch aus der Zeit, als es in C keinen bool gab. Dort findet sich (Quelle WinDef.h aus Visual Studio 2008):
Code:
#ifndef BASETYPES
#define BASETYPES
typedef unsigned long ULONG;
typedef ULONG *PULONG;
typedef unsigned short USHORT;
typedef USHORT *PUSHORT;
typedef unsigned char UCHAR;
typedef UCHAR *PUCHAR;
typedef char *PSZ;
#endif /* !BASETYPES */

#define MAX_PATH         260

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

#ifndef FALSE
#define FALSE              0
#endif

#ifndef TRUE
#define TRUE               1
#endif

// gekürzt ...

#undef FAR
#undef NEAR
#define FAR                far
#define NEAR               near
#ifndef CONST
#define CONST              const
#endif

typedef unsigned long      DWORD;
typedef int                BOOL;
typedef unsigned char      BYTE;
typedef unsigned short     WORD;
typedef float              FLOAT;
typedef FLOAT              *PFLOAT;
typedef BOOL near          *PBOOL;
typedef BOOL far           *LPBOOL;
typedef BYTE near          *PBYTE;
typedef BYTE far           *LPBYTE;
typedef int near           *PINT;
typedef int far            *LPINT;
typedef WORD near          *PWORD;
typedef WORD far           *LPWORD;
typedef long far           *LPLONG;
typedef DWORD near         *PDWORD;
typedef DWORD far          *LPDWORD;
typedef void far           *LPVOID;
typedef CONST void far     *LPCVOID;

typedef int                INT;
typedef unsigned int       UINT;
typedef unsigned int       *PUINT;
Solche Dinge sind also immer Bibliotheksspezifisch. Zumindest was die WinAPI angeht, kann man aber von festen größen ausgehen.

Aber nicht davon, dass ein int immer 32 Bit groß ist, das ist bei Visual C++ und dem C++ Builder der Fall, beim Intel C++ aber z.B. nicht immer.

[Edit]
Übrigens gilt für COM anscheinend
Code:
typedef short VARIANT_BOOL;
Das sind also 16-Bit, und VARIANT_TRUE ist -1 !
[/Edit]

Zu C#, dort ist ein bool definitiv kein int, sondern ein Alias für
Code:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public struct Boolean : IComparable, IConvertible, IComparable<bool>,
   IEquatable<bool>

Geändert von Robotiker (28. Okt 2012 um 10:16 Uhr)
  Mit Zitat antworten Zitat