10 Stimmen

Zweck des VOID-Makros in Großbuchstaben & INT typedef in winnt.h

Hat jemand eine Ahnung, warum es einen Großbuchstaben gibt? VOID Makro definiert in der winnt.h Kopfzeile?

Um die Sache noch verwirrender zu machen, VOID ein Makro ist, während CHAR , SHORT , INT y LONG sind Typendefinitionen.

Siehe den entsprechenden Auszug aus winnt.h :

#ifndef VOID
#define VOID void
typedef char CHAR;
typedef short SHORT;
typedef long LONG;
#if !defined(MIDL_PASS)
typedef int INT;
#endif
#endif

Vielleicht ein historischer Grund für dieses Vorgehen VOID* pointer anstelle von void* pointer ?

EDIT : Noch beunruhigender ist die Tatsache, dass die Menschen VOID anstelle von void bei der Windows-Programmierung heute . Sie können es auch als Teil der MSDN-Dokumente sehen, z. B. http://msdn.microsoft.com/en-us/library/bb205867(v=vs.85).aspx

19voto

bdonlan Punkte 213545

Die Windows-API ist veraltet. Wirklich alt. Älter als die offizielle C-Norm alt.

Das bedeutet, dass die Windows-API anfangs mit allen möglichen alten C-Compilern mit unterschiedlichem Niveau der Sprachunterstützung zurechtkommen musste. Einige unterstützen möglicherweise nicht void . Einige haben vielleicht eine int Typ, der nicht mit dem kompatibel ist, was Windows für den int . Manche verstehen vielleicht nicht short . Als Abhilfe bietet die Windows-API portable Großbuchstaben-Äquivalente, die als Alias für den jeweiligen Compiler verwendet werden.

Mit modernen Compilern haben sich die Dinge natürlich etwas beruhigt. Jeder unterstützt void zum Beispiel. Um jedoch die Kompatibilität mit altem Code, der diese Makros in Großbuchstaben verwendet, zu erhalten, wird die #define s und typedef s müssen bleiben.

14voto

Jerry Coffin Punkte 452852

Der ursprüngliche Grund dafür ist, dass die Win32-API ursprünglich sprachunabhängig sein sollte, so dass sie ihre eigenen Namen erfanden (gemäß ihrer Namenskonvention) und dann eine C-Implementierung davon anboten. In Wirklichkeit wird vieles von dem, was sie definiert haben, von den meisten Nutzern anderer Sprachen (und größtenteils sogar von Nutzern von C) ignoriert.

Soweit die Gründe VOID#define anstelle einer typedef Das ist ganz einfach: Die erforderliche typedef würde sein typedef void VOID; aber C (wie von Microsofts C-Compilern aus dieser Zeit "definiert") erlaubt das einfach nicht, also wird stattdessen ein Makro verwendet.

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