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

时间:2009-03-19 12:52:39

标签: c++ c-preprocessor

我知道WIN32表示win32编译,但_WIN32用于什么?

3 个答案:

答案 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,对我来说似乎更安全。