C++ “的含义;保留供实施之用”;

C++ “的含义;保留供实施之用”;,c++,C++,我读了一篇文章,无意中发现了下面的引文: 2003 C++标准: 17.4.3.2.1全局名称[lib.Global.names] 某些名称和函数签名集始终保留给实现: 每个名称包含一个双下划线(u)或以下划线开头,后跟一个大写字母(2.11)的,都保留给实现以供任何使用 每个以下划线开头的名称都保留给实现,以用作全局命名空间中的名称。165 165)此类名称也保留在namespace::std(17.4.3.1)中 为实现而保留的的确切含义是什么?就是这样。这意味着,如果您只提供编译器或

我读了一篇文章,无意中发现了下面的引文:

<> 2003 C++标准:

17.4.3.2.1全局名称[lib.Global.names] 某些名称和函数签名集始终保留给实现:

  • 每个名称包含一个双下划线(u)或以下划线开头,后跟一个大写字母(2.11)的,都保留给实现以供任何使用
  • 每个以下划线开头的名称都保留给实现,以用作全局命名空间中的名称。165
165)此类名称也保留在namespace::std(17.4.3.1)中


为实现而保留的的确切含义是什么?

就是这样。这意味着,如果您只提供编译器或标准库实现,您只允许创建这样的名称。

< P>“实现”是指“C++语言的实现”。它包括执行C++程序所需的一切:编译器、标准库、执行硬件、操作系统、可视化系统、输入等。 所讨论的限制意味着您的编译器可以在不告诉您的情况下预定义保留表单的名称,或者您的标准库实现可以这样做。例如,您的标准库可能会定义一个宏
\uuuuufoo
,因此如果您试图在源代码中使用
\uuuuuufoo
作为标识符,那么实际上最终将替换宏

保留名称的目的是给编译器和标准库自由在纯C++中表达功能,而不必担心引入与用户代码的名称冲突。 对于如何在实践中使用它的生动示例,只需查看标准库实现的任何头文件


一些保留名称实际上已被编入定义明确、公开可用的设施中:
\uuuuuuuuuuuuuuuuu
\uuuuuuuuucplusplus
\uuuuuu VA_uuuargs\uuuuuuuuuuuuu
,等等。C语言(对保留标识具有相同的规则)一直专门使用保留名称来引入新关键字(例如,
\u Bool
)。

实现这里指的是编译器(如gcc、msvc等)、标准库(说明语言中包含哪些功能)的组合,操作系统(Windows、Mac等)和硬件(英特尔、ARM等)。

根据实现,定义了某些值,编译器使用这些值生成特定于实现的目标代码。比如说

__TARGET_ARCH_ARM is defined by RealView #Matches first case
_M_ARM is defined by Visual Studio #Matches second case
确定CPU制造商

简而言之,这些条款旨在阻止您使用上述格式的宏

实际上,n3797->17.6.5.3宏定义的限制说明,如果您希望定义上述格式的宏,它们是:

适用于#if预处理指令,除非明确 另有说明

例如:

#ifndef _M_ARM
#define _M_ARM // Say you're compiling for another platform
#endif
注意


保留用于实现的宏不限于上述格式。例如,
\uuuuu arm\uuuuuu
由gcc定义以识别制造商。

保留供编译器使用和实现。这意味着您不允许在程序中使用此类名称。只有编译器和标准库才可以使用这样的名称。听说过一个惊人的错误,有人在其中一个标准库标题中定义了一个宏,碰巧用作ifdef保护。想象一下,要花多长时间才能找到…@巴里:有一个可怕的习惯,就是开始用下划线包括警卫,这只是自找麻烦。。。