我知道 WIN32
表示win32编译但是 _WIN32
是用来做什么的?
原文由 Adam Naylor 发布,翻译遵循 CC BY-SA 4.0 许可协议
我知道 WIN32
表示win32编译但是 _WIN32
是用来做什么的?
原文由 Adam Naylor 发布,翻译遵循 CC BY-SA 4.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 许可协议
3 回答1.3k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
4 回答840 阅读
1 回答914 阅读
1 回答949 阅读
1 回答715 阅读
1 回答816 阅读
WIN32
是您可以在自己的代码中使用甚至定义的名称,因此可能与 Microsoft 的用法发生冲突。_WIN32
是为实现者(在本例中为 Microsoft)保留的名称,因为它以下划线和大写字母开头 - 您不允许在自己的代码中定义保留名称,因此可以没有冲突。