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


Answers:


53

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


当您说“使用”时,您是说我可以:#define WIN32 12345或:#ifdef WIN32
Adam Naylor

“使用”是指#ifdef#define_WIN32是指在#ifdef。上下文中的任何程序都可使用。
Hans-Christoph Steiner

81

详细说明(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的编译器-也许是用于Max的某些版本的Office。


19

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.