18 Stimmen

Warum werden standard Datentypen nicht in der Win32-API verwendet?

Ich lerne schon seit einiger Zeit Visual C++ Win32-Programmierung. Warum werden Datentypen wie DWORD, WCHAR, UINT usw. anstelle von z. B. unsigned long, char, unsigned int und so weiter verwendet?

Ich muss mich daran erinnern, wann ich WCHAR anstelle von const char * verwenden muss, und das ärgert mich wirklich. Warum werden nicht standardmäßige Datentypen verwendet? Würde es helfen, wenn ich mir die Win32-Äquivalente merke und diese auch für meine eigenen Variablen verwende?

18voto

Mats Petersson Punkte 123984

Ja, du solltest den richtigen Datentyp für die Argumente von Funktionen verwenden, sonst wirst du wahrscheinlich in Schwierigkeiten geraten.

Und der Grund, warum diese Typen so definiert sind, anstatt int, char und so weiter zu verwenden, ist, dass es das "wie groß der Compiler einen int dimensioniert" aus der Schnittstelle des Betriebssystems entfernt. Das ist eine sehr gute Sache, denn wenn du Compiler A, oder Compiler B, oder Compiler C verwendest, werden sie alle dieselben Typen verwenden - nur die Headerdatei der Bibliotheksschnittstelle muss die richtigen Typen definieren.

Indem man Typen definiert, die keine Standardtypen sind, ist es einfach, z.B. int von 16 auf 32 Bit zu ändern. Die ersten C/C++-Compiler für Windows verwendeten 16-Bit-Integer. Erst in den späten 1990er Jahren erhielt Windows eine 32-Bit-API, und bis zu diesem Zeitpunkt verwendete man int, das 16-Bit war. Stell dir vor, du hast ein gut funktionierendes Programm, das mehrere hundert int-Variablen verwendet, und plötzlich musst du ALLE diese Variablen auf etwas anderes ändern... Wäre nicht sehr nett, oder - besonders da EINIGE dieser Variablen NICHT geändert werden müssen, weil die Umstellung auf ein 32-Bit-Int für einen Teil deines Codes keinen Unterschied machen wird, also kein Grund, diese Teile zu ändern.

Es sei darauf hingewiesen, dass WCHAR NICHT dasselbe ist wie const char - WCHAR ist ein "wide char", also ist wchar_t der vergleichbare Typ.

Also, im Grunde genommen ist das "Definieren unseres eigenen Typs" eine Möglichkeit zu garantieren, dass es möglich ist, die zugrunde liegende Compiler-Architektur zu ändern, ohne (viel von dem) Quellcode ändern zu müssen. Alle größeren Projekte, die maschinenabhängiges Codieren durchführen, verwenden diese Art von Vorgehen.

12voto

Keith Thompson Punkte 240701

Die Größen und anderen Eigenschaften der integrierten Typen wie int und long können je nach Compiler variieren, meist abhängig von der zugrunde liegenden Architektur des Systems, auf dem der Code ausgeführt wird.

Zum Beispiel betrug auf den 16-Bit-Systemen, auf denen Windows ursprünglich implementiert wurde, int nur 16 Bits. Auf moderneren Systemen sind es 32 Bits.

Microsoft kann Typen wie DWORD definieren, sodass deren Größen in verschiedenen Versionen ihres Compilers oder anderer Compiler, die zum Kompilieren von Windows-Code verwendet werden, gleich bleiben.

Und die Namen sollen Konzepte des zugrunde liegenden Systems widerspiegeln, wie von Microsoft definiert. Ein DWORD ist ein "Double Word" (das, wenn ich mich richtig erinnere, 32 Bits auf Windows sind, obwohl ein Maschinen-"Word" wahrscheinlich 32 oder sogar 64 Bits auf modernen Systemen beträgt).

Es wäre vielleicht besser gewesen, die in definierten Festbreitentypen zu verwenden, wie z.B. uint16_t und uint32_t - aber diese wurden erst durch den ISO-C-Standard von 1999 in die C-Sprache eingeführt (den Microsofts Compiler auch heute nicht vollständig unterstützt).

Wenn Sie Code schreiben, der mit der Win32-API interagiert, sollten Sie definitiv die von dieser API definierten Typen verwenden. Für Code, der nicht mit Win32 interagiert, können Sie die Typen verwenden, die Ihnen gefallen, oder die Typen, die vom verwendeten Interface vorgeschlagen werden.

11voto

rodrigo Punkte 87935

Ich denke, dass es sich um einen historischen Zufall handelt.

Meine Theorie ist, dass die ursprünglichen Windows-Entwickler wussten, dass die standardmäßigen C-Typgrößen vom Compiler abhängen, das heißt, ein Compiler kann ein 16-Bit-Integer und ein anderer ein 32-Bit-Integer haben. Also entschieden sie sich, die Window-API zwischen verschiedenen Compilern mit einer Reihe von Typdefinitionen portabel zu machen: DWORD ist ein 32-Bit-Unsigned-Integer, egal welchen Compiler/Architektur Sie verwenden. Natürlich verwenden Sie heutzutage uint32_t aus , aber das war zu der Zeit nicht verfügbar.

Dann, mit der UNICODE-Sache, bekamen sie das TCHAR vs. CHAR vs. WCHAR Problem, aber das ist eine andere Geschichte.

Und dann ist es außer Kontrolle geraten und Sie bekommen solch schöne Dinge wie typedef void VOID, *PVOID;, die völlig unsinnig sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X