C++ 什么';s WIN32与C+中定义的"U WIN32"之间的区别+;

C++ 什么';s WIN32与C+中定义的"U WIN32"之间的区别+;,c++,c-preprocessor,C++,C Preprocessor,我知道WIN32表示WIN32编译,但是\u WIN32用于什么?WIN32是一个您可以在自己的代码中使用甚至定义的名称,因此可能与Microsoft的用法冲突\u WIN32是为实现者保留的名称(在本例中为Microsoft),因为它以下划线和大写字母开头-不允许在自己的代码中定义保留名称,因此不会有冲突。WIN32是一个可以在自己的代码中使用甚至定义的名称,因此可能会与Microsoft的使用发生冲突\u WIN32是为实现者保留的名称(在本例中为Microsoft),因为它以下划线和大写字

我知道
WIN32
表示WIN32编译,但是
\u WIN32
用于什么?

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

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

WIN32是用户定义的标志,某些标头可能需要它。 _WIN32由visual C/C++编译器自动定义。因为它以一个u开头,后跟一个大写字符,所以它由实现保留(意味着C/C++工具链提供程序)


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

WIN32是一个用户定义的标志,某些标题可能需要它。 _WIN32由visual C/C++编译器自动定义。因为它以一个u开头,后跟一个大写字符,所以它由实现保留(意味着C/C++工具链提供程序)

我更喜欢使用(阅读)\u WIN32,对我来说似乎更安全。

详细说明(尼尔·巴特沃斯和布鲁.tuxedo已经给出了正确的答案):

  • WIN32
    由SDK或生成环境定义,因此它不使用实现保留命名空间
  • \u WIN32
    编译器定义,因此它使用下划线将其放置在实现保留的命名空间中
您会发现一组类似的双定义,它们的名称和用法几乎相同,例如
\u UNICODE
/
UNICODE
\u DEBUG
/
DEBUG
,或者可能是
\u DLL
/
DLL
(我认为只有UNICODE的双定义在不同的版本中才有很大的用处)。虽然有时在这些情况下(如
\u UNICODE
),它们不是由编译器定义的下划线版本,而是用于控制CRT头的功能:

  • \u UNICODE
    告诉CRT头,可以是UNICODE或ANSI的CRT名称(例如
    \u tcslen()
    应映射到宽字符变体(
    wcslen()
  • UNICODE
    对SDK做了类似的事情(将Win32 API映射到它们的“
    W
    ”变体)
基本上,带下划线的版本由编译器团队控制或使用,不带下划线的版本由编译器之外的团队控制/使用。当然,由于与以前版本的兼容性,可能会有很多重叠,而且只是一个团队或另一个团队的一般错误

我发现这很让人困惑——并且发现它们在用户代码中几乎可以互换使用(通常,当你看到一个定义时,你会看到另一个定义在同一个地方,因为如果你需要一个,你就需要另一个)。我个人认为,你应该使用没有下划线的版本(除非你正在编写编译器的运行时)在定义它们时,请确保它们都已定义(无论是通过侦听器还是编译器开关,视情况而定)


请注意,SDK将在为Mac构建时定义WIN32,因为编译器没有,有点超出了它的界限。我不确定哪些项目使用WIN32 API或针对Mac的编译器-可能是某些版本的Office for the Max或其他东西。

详细说明(尼尔·巴特沃斯(Neil Butterworth)和blue.tuxedo已经给出了正确答案):

  • WIN32
    由SDK或生成环境定义,因此它不使用实现保留命名空间
  • \u WIN32
    编译器定义,因此它使用下划线将其放置在实现保留的命名空间中
您会发现一组类似的双定义,它们的名称和用法几乎相同,例如
\u UNICODE
/
UNICODE
\u DEBUG
/
DEBUG
,或者可能是
\u DLL
/
DLL
(我认为在不同的版本中,只有UNICODE才有很大的用处)。尽管有时在这些情况下(如
\u UNICODE
),它们不是由编译器定义的下划线版本,而是用于控制CRT标题的功能:

  • \u UNICODE
    告诉CRT头,可以是UNICODE或ANSI的CRT名称(例如
    \u tcslen()
    应映射到宽字符变体(
    wcslen()
  • UNICODE
    对SDK做了类似的事情(将Win32 API映射到它们的“
    W
    ”变体)
基本上,带下划线的版本由编译器团队控制或使用,不带下划线的版本由编译器之外的团队控制/使用。当然,由于与以前版本的兼容性,可能会有很多重叠,而且只是一个团队或另一个团队的一般错误

我发现这很让人困惑——并且发现它们在用户代码中几乎可以互换使用(通常,当你看到一个定义时,你会看到另一个定义在同一个地方,因为如果你需要一个,你就需要另一个)。我个人认为,你应该使用没有下划线的版本(除非你正在编写编译器的运行时)在定义它们时,请确保它们都已定义(无论是通过侦听器还是编译器开关,视情况而定)


请注意,在构建时SDK将定义
\u WIN32