Ich weiß, dass dies WIN32
die Win32-Kompilierung bedeutet, aber wofür wird sie _WIN32
verwendet?
Ich weiß, dass dies WIN32
die Win32-Kompilierung bedeutet, aber wofür wird sie _WIN32
verwendet?
Antworten:
WIN32
ist 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. _WIN32
ist 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.
#ifdef
und #define
. _WIN32
soll von jeder Programmierung im Kontext von verwendet werden #ifdef
.
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_WIN32
wird vom Compiler definiert und verwendet den Unterstrich, um ihn im für die Implementierung reservierten Namespace zu platzierenSie werden einen ähnlichen Satz von dualen Definitionen mit nahezu identischen Namen und ähnlichen Verwendungen wie _UNICODE
/ UNICODE
, _DEBUG
/ DEBUG
oder 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:
_UNICODE
teilt 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()
)UNICODE
macht 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 _WIN32
beim 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.
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.