¿Cuál es la diferencia entre las definiciones WIN32 y _WIN32 en C++?

¿Cuál es la diferencia entre las definiciones WIN32 y _WIN32 en C++?

Para elaborar (Neil Butterworth y blue.tuxedo ya han dado la respuesta correcta):

  • WIN32 está definido por el SDK o el entorno de compilación, por lo que no utiliza el espacio de nombres reservado para la implementación
  • _WIN32 está definido por el compilador por lo que usa el guión bajo para colocarlo en el espacio de nombres reservado para la implementación

Encontrará un conjunto similar de definiciones duales con nombres casi idénticos y usos similares, como _UNICODE /UNICODE , _DEBUG /DEBUG , o tal vez _DLL /DLL (Creo que solo los UNICODE tienen mucho uso en sus diferentes versiones). Aunque a veces en estos casos (como _UNICODE ), en lugar de que la versión de subrayado esté definida por el compilador, se utilizan para controlar lo que hacen los encabezados CRT:

  • _UNICODE le dice a los encabezados de CRT que los nombres de CRT que pueden ser Unicode o ANSI (como _tcslen() debe asignarse a la variante de caracteres anchos (wcslen() )
  • UNICODE hace algo similar para el SDK (asigna las API de Win32 a su "W " variantes)

Esencialmente, las versiones con el guión bajo están controladas o son utilizadas por el equipo compilador, las versiones sin el guión bajo son controladas/utilizadas por equipos externos al compilador. Por supuesto, probablemente habrá mucha superposición debido a la compatibilidad con versiones anteriores y errores generales de un equipo u otro.

Lo encuentro muy confuso, y descubro que se usan casi indistintamente en el código de usuario (por lo general, cuando ve uno definido, verá el otro definido en el mismo lugar, porque si necesita uno necesita el otro). Personalmente, creo que deberías usar las versiones sin el guión bajo (a menos que esté escribiendo el tiempo de ejecución del compilador) y asegúrese de que ambas estén definidas (ya sea a través de oyentes o conmutadores del compilador, según corresponda) cuando esté definiendo una.

Tenga en cuenta que el SDK definirá _WIN32 al compilar para Mac porque el compilador no lo hace, como que se pasa de los límites. No estoy seguro de qué proyectos usan una API Win32 y un compilador dirigido a Mac, tal vez alguna versión de Office para Max o algo así.


WIN32 es un nombre que podría usar e incluso definir en su propio código y, por lo tanto, podría entrar en conflicto con el uso de Microsoft. _WIN32 es un nombre que está reservado para el implementador (en este caso, Microsoft) porque comienza con un guión bajo y una letra mayúscula; no puede definir nombres reservados en su propio código, por lo que no puede haber conflictos.


WIN32 es un indicador definido por el usuario que puede ser requerido por algunos encabezados._WIN32 se define automáticamente por el compilador visual C/C++. Dado que comienza con un _ seguido de un carácter mayúscula, está reservado por la implementación (es decir, el proveedor de la cadena de herramientas de C/C++).

Prefiero usar (leer) _WIN32, me parece más seguro.