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

新手上路,请多包涵

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

原文由 Adam Naylor 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 667
2 个回答

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

原文由 anon 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

You’ll find a similar set of dual defines with nearly identical names and similar uses such as _UNICODE / UNICODE , _DEBUG / DEBUG ,或者 _DLL / DLL (我认为只有 UNICODE 的版本在不同的版本中有很多用途)。尽管有时在这些情况下(如 _UNICODE ),而不是编译器定义 下划线版本,它们用于控制 CRT 标头的作用:

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

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

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


请注意,SDK 将在为 Mac 构建时定义 _WIN32 因为编译器没有,有点越界了。我不确定哪些项目使用 Win32 API 和针对 Mac 的编译器 - 可能是某些版本的 Office for Mac 或其他东西。

原文由 Michael Burr 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题