84

我知道这WIN32表示 win32 编译,但它是_WIN32用来做什么的?

4

3 回答 3

87

详细说明(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 之类的。

于 2009-03-19T15:05:31.847 回答
58

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

于 2009-03-19T12:57:02.840 回答
22

WIN32 是用户定义的标志,某些标头可能需要它。_WIN32 由可视化 C/C++ 编译器自动定义。由于它以 _ 开头,后跟大写字符,因此由实现保留(即 C/C++ 工具链提供程序)。

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

于 2009-03-19T12:59:15.753 回答