我知道这WIN32
表示win32编译,但是它_WIN32
用于什么呢?
Answers:
WIN32
是一个您可以使用的名称,甚至可以在您自己的代码中定义,因此可能会与Microsoft的用法冲突。_WIN32
是为实现者(在本例中为Microsoft)保留的名称,因为它以下划线和大写字母开头-不允许在自己的代码中定义保留的名称,因此不会发生冲突。
#ifdef
和#define
。 _WIN32
是指在#ifdef
。上下文中的任何程序都可使用。
详细说明(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。