Was ist der Unterschied zwischen WIN32 und _WIN32 in C ++?

75

Ich weiß, dass dies WIN32die Win32-Kompilierung bedeutet, aber wofür wird sie _WIN32verwendet?

Adam Naylor
quelle

Antworten:

53

WIN32ist ein Name, den Sie verwenden und sogar in Ihrem eigenen Code definieren können und der daher möglicherweise mit der Verwendung von Microsoft in Konflikt gerät. _WIN32ist ein Name, der für den Implementierer (in diesem Fall Microsoft) reserviert ist, da er mit einem Unterstrich und einem Großbuchstaben beginnt. Sie dürfen keine reservierten Namen in Ihrem eigenen Code definieren, sodass es nicht zu Konflikten kommen kann.

Der Geschichtenerzähler
quelle
Wenn Sie "verwenden" sagen, meinen Sie, ich könnte: #define WIN32 12345 oder: #ifdef WIN32
Adam Naylor
mit 'benutze' meine ich #ifdefund #define. _WIN32soll von jeder Programmierung im Kontext von verwendet werden #ifdef.
Hans-Christoph Steiner
81

Zur Ausarbeitung (Neil Butterworth und blue.tuxedo haben bereits die richtige Antwort gegeben):

  • WIN32 wird vom SDK oder der Build-Umgebung definiert, sodass der für die Implementierung reservierte Namespace nicht verwendet wird
  • _WIN32wird vom Compiler definiert und verwendet den Unterstrich, um ihn im für die Implementierung reservierten Namespace zu platzieren

Sie werden einen ähnlichen Satz von dualen Definitionen mit nahezu identischen Namen und ähnlichen Verwendungen wie _UNICODE/ UNICODE, _DEBUG/ DEBUGoder vielleicht _DLL/ finden DLL(ich denke, dass nur die UNICODE-Definitionen in ihren verschiedenen Versionen viel Verwendung finden). Obwohl manchmal in diesen Fällen (wie _UNICODE) anstelle der vom Compiler definierten Unterstrichversion verwendet wird , werden sie verwendet, um zu steuern, was die CRT-Header tun:

  • _UNICODEteilt den CRT-Headern mit, dass CRT-Namen entweder Unicode oder ANSI sein können (z. B. _tcslen()sollten sie der breiten Zeichenvariante zugeordnet werden ( wcslen())
  • UNICODEmacht etwas ähnliches für das SDK (ordnet Win32-APIs ihren " W" Varianten zu)

Im Wesentlichen werden die Versionen mit dem Unterstrich vom Compilerteam gesteuert oder verwendet, die Versionen ohne Unterstrich werden von Teams außerhalb des Compilers gesteuert / verwendet. Natürlich wird es aufgrund der Kompatibilität mit früheren Versionen und nur allgemeinen Fehlern des einen oder anderen Teams wahrscheinlich zu großen Überschneidungen kommen.

Ich finde es verdammt verwirrend - und finde, dass sie im Benutzercode fast austauschbar verwendet werden (normalerweise, wenn Sie eine Definition sehen, sehen Sie die andere an derselben Stelle definiert, denn wenn Sie eine brauchen, brauchen Sie die andere). Ich persönlich denke, dass sollten Sie verwenden die Versionen ohne Unterstrich (es sei denn , Sie die Compiler Laufzeit gerade schreiben) und stellen Sie sicher , sie beide get definiert (ob über Hörer oder Compiler - Schalter je nach Fall) , wenn Sie einen sind zu definieren.


Beachten Sie, dass das SDK _WIN32beim Erstellen für den Mac definiert, da der Compiler dies nicht tut und die Grenzen überschreitet. Ich bin mir nicht sicher, welche Projekte eine Win32-API und einen Compiler für den Mac verwenden - vielleicht eine Version von Office for the Max oder so.

Michael Burr
quelle
19

WIN32 ist ein benutzerdefiniertes Flag, das möglicherweise von einigen Headern benötigt wird. _WIN32 wird automatisch vom visuellen C / C ++ - Compiler definiert. Da es mit einem _ gefolgt von einem Großbuchstaben beginnt, wird es von der Implementierung reserviert (dh dem C / C ++ - Toolchain-Anbieter).

Ich bevorzuge (lesen) _WIN32, scheint mir sicherer.

bltxd
quelle