web-dev-qa-db-fra.com

Quelle est la différence entre les définitions WIN32 et _WIN32 en C ++

Je le sais WIN32 indique la compilation de win32 mais qu'est-ce que _WIN32 utilisé pour?

69
Adam Naylor

WIN32 est un nom que vous pourriez utiliser et même définir dans votre propre code et pourrait donc entrer en conflit avec l'utilisation de Microsoft. _WIN32 est un nom réservé à l'implémenteur (dans ce cas Microsoft) car il commence par un trait de soulignement et une lettre majuscule - vous n'êtes pas autorisé à définir des noms réservés dans votre propre code, donc il ne peut y avoir de conflit.

49
anon

Pour élaborer (Neil Butterworth et blue.tuxedo ont déjà donné la bonne réponse):

  • WIN32 Est défini par le SDK ou l'environnement de génération, il n'utilise donc pas l'espace de noms réservé à l'implémentation
  • _WIN32 Est défini par le compilateur il utilise donc le trait de soulignement pour le placer dans l'espace de noms réservé à l'implémentation

Vous trouverez un ensemble similaire de définitions doubles avec des noms presque identiques et des utilisations similaires telles que _UNICODE/UNICODE, _DEBUG/DEBUG, ou peut-être _DLL/DLL (je pense que seuls les UNICODE sont très utiles dans leurs différentes versions). Bien que parfois dans ces cas (comme _UNICODE), Au lieu que la version de soulignement soit définie par le compilateur, elles sont utilisées pour contrôler ce les en-têtes CRT:

  • _UNICODE Indique aux en-têtes CRT que les noms CRT qui peuvent être Unicode ou ANSI (tels que _tcslen() doivent correspondre à la variante de caractère large (wcslen())
  • UNICODE fait quelque chose de similaire pour le SDK (mappe les API Win32 à leurs variantes "W")

Essentiellement, les versions avec le trait de soulignement sont contrôlées par ou utilisées par l'équipe du compilateur, les versions sans trait de soulignement sont contrôlées/utilisées par des équipes en dehors du compilateur. Bien sûr, il y aura probablement beaucoup de chevauchements en raison de la compatibilité avec les versions antérieures et juste des erreurs générales d'une équipe ou de l'autre.

Je trouve cela déroutant - et je trouve qu'ils sont utilisés presque de manière interchangeable dans le code utilisateur (généralement, lorsque vous en voyez un défini, vous verrez l'autre défini au même endroit, car si vous en avez besoin, vous avez besoin de l'autre). Personnellement, je pense que vous devriez utiliser les versions sans le soulignement (sauf si vous écrivez le runtime du compilateur) et vous assurer qu'elles sont toutes les deux définies (que ce soit via des écouteurs ou des commutateurs du compilateur selon le cas) lorsque vous en définissez un.


Notez que le SDK définira _WIN32 Lors de la construction pour le Mac car le compilateur ne le fait pas, sorte de dépassement de ses limites. Je ne sais pas quels projets utilisent une API Win32 et un compilateur ciblant le Mac - peut-être une version d'Office pour Max ou quelque chose.

77
Michael Burr

WIN32 est un indicateur défini par l'utilisateur qui peut être requis par certains en-têtes. _WIN32 est automatiquement défini par le compilateur visuel C/C++. Puisqu'il commence par un _ suivi d'un caractère majuscule, il est réservé par l'implémentation (c'est-à-dire le fournisseur de la chaîne d'outils C/C++).

Je préfère utiliser (lire) _WIN32, me semble plus sûr.

19
bltxd