![]() |
Typübersetzung C? <> Delphi
Ich glaub langsam, daß man C erfunden hat, um die Programmierer um ihren Verstand zu bringen.
Nja, jedenfalls dachte ich mal, ich hätte das Prinzip verstanden, aber irgendwie lese ich grade überall was Anderes. :wall: Ist bool denn nun Boolean/boolean oder LongBool/int? Also in C++. Stimmt das denn nun so? BOOL (C) = int bool (C++) = boolean/byte = Boolean (D) BOOL (C++) = int = LongBool/NativeInt (D mit 32 Bit) bool (C#) = int bool? (C#) = nullable boolean (TRUE FALSE NULL) boolean = Boolean (D) BOOLEAN = ? Es ist ja schon schlimm genug, daß man case-sensitive Systeme erfindet, aber wer soll da denn noch durchsehn? :? 'nen schönen Abend noch und ich hoffe hier bekommt nicht nochwer Albträume davon. [add] Ach ja, int war doch in C++ der Delphi-Integer und vorallem der, welcher auf 32 Bit eingefroren? Gibt es in C++ denn nun einen 64 Bit-Boolean-Typ? Also das nächst Größere, wie LongBool. In System.pas und in der Codevervollständigung konnte ich jedenfals nichts Entsprechendes. Und gibt es vielleicht noch andere Typen, wo man aufpassen muß? ( ist int = INT ? ) |
AW: Typübersetzung C? <> Delphi
Zitat:
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: ![]() [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:
Solche Dinge sind also immer Bibliotheksspezifisch. Zumindest was die WinAPI angeht, kann man aber von festen größen ausgehen.
#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; 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:
Das sind also 16-Bit, und VARIANT_TRUE ist -1 !
typedef short VARIANT_BOOL;
[/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> |
AW: Typübersetzung C? <> Delphi
C macht Einem das Leben nicht wirklich einfach. :wall:
Das mit den Booleans ist schon krankhaft, aber wer kommt auf die Idee mit dem "register"?
Code:
Register heißt ja nun, daß dieser eine Parameter, welche mitten drin liegt, in die Register soll, obwohl alle anderen Parameter auf dem Stack liegen.
typedef void (*sort_func_t)(void *, size_t, register size_t, compare_func_t TSRMLS_DC);
Delphi-Quellcode:
Das davor geht ja leider nicht, da es in cdel keine Register gibt und mit Registern von Links nach rechts sieht es irgendwie doof aus und der Code wird inkompatibel. :wall:
type
sort_func_t = procedure(pDest: Pointer; dIndex: NativeUInt; register bucket_size: NativeUInt; proc: compare_func_t {$I TSRMLS_DC}); cdecl;
Delphi-Quellcode:
type
sort_func_t = procedure(bucket_size: NativeUInt; dummy, dummy2: Integer {$I TSRMLS_DC}; proc: compare_func_t; dIndex: NativeUInt; pDest: Pointer); |
AW: Typübersetzung C? <> Delphi
Zitat:
register ist wie inline nur ein Vorschlag für den Compiler. Es stammt noch aus frühen C Zeiten und wird zuminest in der heutigen C++ Programmierung auf dem PC praktisch nicht verwendet. Für einen Delphi Programmierer unter Windos spielt es eigentlich gar keine Rolle, da der MS Compiler register sowieso ignoriert. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz