2013-02-20 5 views
17

Ich lerne seit einiger Zeit Visual C++ Win32-Programmierung. Warum werden die Datentypen wie DWORD, WCHAR, UINT usw. anstelle von beispielsweise unsigned long, char, unsigned int usw. verwendet?Warum werden die Standarddatentypen in der Win32-API nicht verwendet?

Ich muss mich erinnern, wann WCHAR anstelle von const char * zu verwenden, und es ist wirklich nervig mich. Warum werden nicht die Standarddatentypen überhaupt verwendet? Wird es helfen, wenn ich Win32-Äquivalente merke und diese auch für meine eigenen Variablen verwende?

+5

'WCHAR' ist nicht dasselbe wie' char * '... (Ich bekomme, was Sie fragen) –

+0

Dies sind Datentypen von Macro Assembler. Das war die Sprache, in der Windows 1.0 größtenteils geschrieben wurde. –

Antwort

17

Ja, Sie sollten den richtigen Datentyp für die Argumente für Funktionen verwenden, oder Sie werden sich wahrscheinlich in Schwierigkeiten finden.

Und der Grund, dass diese Art, wie sie sind definiert ist, anstatt int, char mit und so weiter ist, dass es die entfernt „was der Compiler denkt sollte ein int so bemessen sein,“ von der Schnittstelle des OS. Das ist eine sehr gute Sache, denn wenn Sie den Compiler A oder den Compiler B oder den Compiler C verwenden, werden alle dieselben Typen verwenden - nur die Header-Datei der Bibliotheksschnittstelle muss das Richtige tun, um die Typen zu definieren.

Durch die Definition von Typen, die keine Standardtypen sind, ist es einfach, int von 16 auf 32 Bit zu ändern. Die ersten C/C++ - Compiler für Windows verwendeten 16-Bit-Ganzzahlen. Es war nur in der Mitte der späten 1990er Jahre, dass Windows eine 32-Bit-API bekam, und bis zu diesem Punkt verwendeten Sie int, die 16-Bit war. Stellen Sie sich vor, dass Sie ein gut funktionierendes Programm haben, das mehrere hundert int Variablen verwendet, und plötzlich müssen Sie ALLE diese Variablen auf etwas anderes ändern ... Wäre nicht sehr nett, richtig - besonders als EINIGE von denen Variablen müssen NICHT geändert werden, da der Wechsel zu einem 32-Bit-Int für einen Teil Ihres Codes keinen Unterschied macht, daher ist es nicht sinnvoll, diese Bits zu ändern.

Es soll beachtet werden, dass WCHAR nicht das gleiche ist wie const char - WCHAR ist ein „wide char“ so wchar_t der vergleichbare Typ ist.

Also, im Grunde, die "definieren Sie unseren eigenen Typ" ist eine Möglichkeit zu garantieren, dass es möglich ist, die zugrunde liegende Compiler-Architektur zu ändern, ohne (viel von) den Quellcode zu ändern. Alle größeren Projekte, die eine maschinenabhängige Codierung durchführen, tun dies.

+2

Und 'wchar_t' stimmt nicht unbedingt mit' WCHAR' überein, wenn Sie einen Nicht-Microsoft-Compiler verwenden. –

+0

Guter Punkt ...... –

+0

Ich bin im Zweifel ... Warum hatte das GNU/Linux kein solches Problem? –

11

Die Größen und andere Merkmale der integrierten Typen wie int und long können von Compiler zu Compiler variieren und hängen normalerweise von der zugrunde liegenden Architektur des Systems ab, auf dem der Code ausgeführt wird.

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

Microsoft kann Typen wie DWORD definieren, so dass ihre Größen über verschiedene Versionen ihres Compilers oder anderer Compiler, die zum Kompilieren von Windows-Code verwendet werden, gleich bleiben.

Und die Namen sollen Konzepte auf dem zugrunde liegenden System widerspiegeln, wie von Microsoft definiert. Ein DWORD ist ein "Doppelwort" (das, wenn ich mich richtig erinnere, ist 32 Bit unter Windows, obwohl ein "Wort" Maschine wahrscheinlich 32 oder sogar 64 Bits auf modernen Systemen ist).

Es könnte besser gewesen, in <stdint.h>, wie uint16_t und uint32_t definierte den mit fester Breite Typen zu verwenden - aber die waren nur auf die Sprache C von 1999 ISO-C-Standard (die Microsoft-Compiler nicht vollständig eingeführt Unterstützung noch heute).

Wenn Sie Code schreiben, der mit der Win32-API interagiert, sollten Sie unbedingt die von dieser API definierten Typen verwenden. Für Code, der nicht mit Win32 interagiert, verwenden Sie die gewünschten Typen oder die von der verwendeten Schnittstelle vorgeschlagenen Typen.

9

Ich denke, dass es ein historischer Unfall ist.

Meine Theorie ist, dass die ursprünglichen Windows-Entwickler wussten, dass die C-Typ-Standardgrößen vom Compiler abhängen, das heißt, ein Compiler kann eine 16-Bit-Ganzzahl und eine andere eine 32-Bit-Ganzzahl haben. Daher entschieden sie sich dafür, die Window API zwischen verschiedenen Compilern mit einer Reihe von typedefs portierbar zu machen: DWORD ist eine 32-Bit-Ganzzahl ohne Vorzeichen, egal welchen Compiler/Architektur Sie verwenden. Natürlich werden Sie heute uint32_t von <stdint.h> verwenden, aber das war zu dieser Zeit nicht verfügbar.

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

Und dann ist es außer Kontrolle geraten und Sie bekommen so schöne Dinge wie typedef void VOID, *PVOID;, die absolut Unsinn sind.

+0

+1 für PVOID Unsinn :) –

+6

Ich würde eine Vermutung wagen, dass Dinge wie PVOID sind Relikte aus der Vergangenheit mit Nah- und Fernzeiger beschäftigen. Offensichtlich sieht es heute albern aus, aber die Leute schätzen nicht, wie alt die Windows API ist. – Luke

Verwandte Themen