我知道WIN32
表示win32编译,但_WIN32
用于什么?
答案 0 :(得分:74)
详细说明(Neil Butterworth和blue.tuxedo已经给出了正确答案):
WIN32
由SDK或构建环境定义,因此它不使用实现保留名称空间_WIN32
由编译器定义,因此它使用下划线将其置于实现保留的命名空间中您会发现一组类似的双重定义,其名称几乎相同,用途相似,例如_UNICODE
/ UNICODE
,_DEBUG
/ DEBUG
,或者{{ 1}} / _DLL
(我认为只有UNICODE在其不同版本中得到了很多用处)。虽然有时在这些情况下(如DLL
),而不是由编译器定义的下划线版本,但它们用于控制CRT标头的作用:
_UNICODE
告诉CRT标题CRT名称可以是Unicode或ANSI(例如_UNICODE
应该映射到宽字符变体(_tcslen()
)wcslen()
为SDK执行类似操作(将Win32 API映射到其“UNICODE
”变体)基本上,带有下划线的版本由编译器团队控制或使用,没有下划线的版本由编译器之外的团队控制/使用。当然,由于与过去版本的兼容性以及一个团队或另一个团队的一般错误,可能会有很多重叠。
我发现它很混乱 - 并且发现它们在用户代码中几乎可以互换使用(通常,当你看到一个被定义时,你会看到另一个被定义在同一个地方,因为如果你需要一个,你需要它其他)。就个人而言,我认为你应该使用没有下划线的版本(除非你正在编写编译器的运行时)并确保它们都被定义(无论是通过听众还是编译器开关)重新定义一个。
请注意,SDK在为Mac构建时会定义W
,因为编译器没有,超出它的范围。我不确定哪些项目使用Win32 API和针对Mac的编译器 - 可能是某些版本的Office for the Max或者什么。
答案 1 :(得分:47)
WIN32
是您可以使用的名称,甚至可以在您自己的代码中定义,因此可能会与Microsoft的用法发生冲突。 _WIN32
是为实现者(在本例中为Microsoft)保留的名称,因为它以下划线和大写字母开头 - 您不能在自己的代码中定义保留名称,因此不会发生冲突
答案 2 :(得分:18)
WIN32是用户定义的标志,某些标头可能需要该标志。 _WIN32由可视化C / C ++编译器自动定义。因为它以_后跟一个大写字符开头,所以它由实现保留(意味着C / C ++工具链提供者)。
我更喜欢使用(阅读)_WIN32,对我来说似乎更安全。