Qual è la differenza tra WIN32 e _WIN32 definisce in C ++

So che WIN32 è ovviamente per indicare la compilazione win32, ma qual è la necessità di _WIN32 ?

WIN32 è un nome che è ansible utilizzare e persino definire nel proprio codice e pertanto potrebbe interferire con l’utilizzo di Microsoft. _WIN32 è un nome riservato all’implementatore (in questo caso Microsoft) perché inizia con un carattere di sottolineatura e una lettera maiuscola: non è ansible definire nomi riservati nel proprio codice, quindi non può esserci conflitto.

Per elaborare (Neil Butterworth e blue.tuxedo hanno già dato la risposta corretta):

  • WIN32 è definito dall’SDK o dall’ambiente di generazione, quindi non utilizza lo spazio dei nomi riservato all’implementazione
  • _WIN32 è definito dal compilatore in modo che utilizzi il carattere di sottolineatura per posizionarlo nello spazio dei nomi riservato all’implementazione

Troverai un insieme simile di dual define con nomi quasi identici e usi simili come _UNICODE / UNICODE , _DEBUG / DEBUG , o forse _DLL / DLL (penso che solo quelli UNICODE siano di gran lunga più utili nelle loro versioni differenti) . Anche se a volte in questi casi (come _UNICODE ), invece della versione underscore definita dal compilatore, vengono utilizzati per controllare cosa fanno le intestazioni CRT:

  • _UNICODE indica alle intestazioni CRT che i nomi CRT che possono essere Unicode o ANSI (come _tcslen() devono essere _tcslen() alla variante del carattere esteso ( wcslen() )
  • UNICODE fa qualcosa di simile per l’SDK (associa le API Win32 alle loro varianti ” W “)

Essenzialmente le versioni con il carattere di sottolineatura sono controllate o utilizzate dal team di compilazione, le versioni senza il carattere di sottolineatura sono controllate / utilizzate dai team esterni al compilatore. Naturalmente, probabilmente ci saranno molte sovrapposizioni dovute alla compatibilità con le versioni precedenti e solo a errori generali di una squadra o dell’altra.

Trovo confusionario come l’inferno – e trovo che sono usati quasi in modo intercambiabile nel codice utente (di solito, quando ne vedi uno definito, vedrai l’altro definito nello stesso posto, perché se ne hai bisogno ne hai bisogno dell’altro). Personalmente, penso che dovresti usare le versioni senza il carattere di sottolineatura (a meno che tu non stia scrivendo il runtime del compilatore) e assicurarti che vengano entrambi definiti (sia tramite ascoltatori o switch del compilatore a seconda dei casi) che stai definendo.


Nota che l’SDK definirà _WIN32 quando costruisce per il Mac perché il compilatore no, il tipo di sovrascrittura dei suoi limiti. Non sono sicuro di quali progetti utilizzino un’API Win32 e un compilatore destinato al Mac, forse una versione di Office per Max o qualcosa del genere.

WIN32 è un flag definito dall’utente che potrebbe essere richiesto da alcune intestazioni. _WIN32 viene automaticamente definito dal compilatore Visual C / C ++. Poiché inizia con un _ seguito da un carattere maiuscolo, viene riservato dall’implementazione (ovvero il provider di toolchain C / C ++).

Preferisco usare (leggere) _WIN32, mi sembra più sicuro.