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

我知道WIN32显然是用win32编译的,但是_win32需要什么呢?

WIN32是一个你可以使用甚至在自己的代码中定义的名称,所以可能会与微软的使用冲突。 _WIN32是一个为实现者(在这种情况下为MS)保留的名称,因为它以一个下划线和一个大写字母开头 – 不允许在自己的代码中定义保留名称,所以不会有冲突。

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

  • WIN32由SDK或构build环境定义,所以它不使用实现保留的命名空间
  • _WIN32编译器定义,所以它使用下划线将其放置在实现保留的名称空间中

你会发现一个类似的双重定义集合,具有几乎相同的名称和相似的用法,比如_UNICODE / UNICODE_DEBUG / DEBUG ,或者_DLL / DLL (我认为只有UNICODE在其不同版本中有很多用途) 。 尽pipe有时在这些情况下(如_UNICODE ),而不是编译器定义的下划线版本,它们用于控制CRT标头的function:

  • _UNICODE告诉CRT标题,可以是Unicode或ANSI(例如_tcslen() CRT名称应映射到宽字符变体( wcslen()
  • UNICODE为SDK做了类似的事情(将Win32 API映射到它们的“ W ”变体)

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

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


请注意,当为Mac构buildSDK时,SDK将定义_WIN32 ,因为编译器没有这样做,有些超越了界限。 我不确定哪些项目使用Win32 API作为针对Mac的编译器 – 也许是某些版本的Office for Max或其他版本。

WIN32是一些用户定义的标志,可能是某些标题所必需的。 _WIN32由Visual C / C ++编译器自动定义。 由于它以_开始,后跟一个大写字母,它由实现(即C / C ++工具链提供者)保留。

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