在C++中定义的WIN32和_WIN32有什么区别

Ada*_*lor 69 c++ c-preprocessor

我知道这WIN32显然是表示win32编译但是需要_WIN32什么?

Mic*_*urr 77

详细说明(Neil Butterworth和blue.tuxedo已经给出了正确答案):

  • WIN32 由SDK或构建环境定义,因此它不使用实现保留命名空间
  • _WIN32编译器定义,因此它使用下划线将它放在实现保留的命名空间中

你会发现一组类似的双重定义具有几乎相同的名称和类似的用途,例如_UNICODE/ UNICODE,_DEBUG/ DEBUG或者_DLL/ DLL(我认为只有UNICODE才能在不同的版本中得到很多用处).虽然有时在这些情况下(如_UNICODE),而不是下划线的版本被定义编译器,它们被用来控制一下CRT头做:

  • _UNICODE告诉CRT标题CRT名称可以是Unicode或ANSI(例如_tcslen()应该映射到宽字符变体(wcslen())
  • UNICODE做类似的SDK(将Win32 API映射到他们的" W"变体)

本质上,带有下划线的版本由编译器团队控制或使用,没有下划线的版本由编译器之外的团队控制/使用.当然,由于与过去版本的兼容性以及一个团队或另一个团队的一般错误,可能会有很多重叠.

我发现它很混乱 - 并且发现它们在用户代码中几乎可以互换使用(通常,当你看到一个被定义时,你会看到另一个被定义在同一个地方,因为如果你需要一个你需要另一个).就个人而言,我认为您应该使用没有下划线的版本(除非您正在编写编译器的运行时),并确保在定义时都定义它们(无论是通过听众还是编译器开关).


请注意,SDK将定义_WIN32何时为Mac构建,因为编译器没有,超出它的界限.我不确定哪些项目使用Win32 API和针对Mac的编译器 - 可能是某些版本的Office for the Max或其他东西.


小智 49

WIN32是一个可以使用的名称,甚至可以在您自己的代码中定义,因此可能会与Microsoft的用法发生冲突._WIN32是为实现者(在本例中为Microsoft)保留的名称,因为它以下划线和大写字母开头 - 您不能在自己的代码中定义保留名称,因此不会发生冲突.


blt*_*txd 19

WIN32是用户定义的标志,某些标头可能需要该标志._WIN32由可视化C/C++编译器自动定义.因为它以_后跟一个大写字符开头,所以它由实现保留(意味着C/C++工具链提供者).

我更喜欢使用(阅读)_WIN32,对我来说似乎更安全.


Hol*_*Cat 6

TL;DR:使用_WIN32,从不使用WIN32

_WIN32当您针对 Windows(甚至 x64)进行编译时,由编译器自动定义。

WIN32很奇怪:

  • 它定义在<windows.h>.
  • MinGW 也会自动定义它,但如果您使用-std=c++??(与-std=gnu++??默认的 相对),则会停止这样做。