规则(在 C++11 中没有改变):
- Reserved in any scope, including for use as implementation https://stackoverflow.com/questions/4297933/c-implementation#4297974 macros:
- 以下划线开头,后跟大写字母的标识符
- 包含相邻下划线(或“双下划线”)的标识符
- Reserved in the global namespace:
- 此外,所有内容都在
std
命名空间被保留。 (不过,您可以添加模板专业化。)
来自 2003 年 C++ 标准:
17.4.3.1.2 全局名称 [lib.global.names]
某些名称和函数签名集始终保留给实现:
- 每个包含双下划线的名称 (
__
)或以下划线开头,后跟大写字母(2.11)保留给实现以供任何使用。
- Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.165
165) Such names are also reserved in namespace ::std
(17.4.3.1).
C++ 语言基于 C 语言(1.1/2、C++03),而 C99 是规范性参考(1.2/1、C++03),因此了解 1999 C 标准的限制很有用(尽管它们并不直接适用于 C++):
7.1.3 保留标识符
每个标头声明或定义其相关子条款中列出的所有标识符,并且
可选地声明或定义在其关联的未来库方向子条款中列出的标识符和标识符,这些标识符始终保留用于任何用途或用作文件范围标识符。
- 所有以下划线和大写字母或其他字母开头的标识符
下划线始终保留用于任何用途。
- 所有以下划线开头的标识符始终保留用作标识符
文件范围位于普通名称空间和标记名称空间中。
- 以下任何子条款中的每个宏名称(包括未来的库
如果包含任何相关标头,则保留按指定使用;
除非另有明确说明(见 7.1.4)。
- All identifiers with external linkage in any of the following subclauses (including the
future library directions) are always reserved for use as identifiers with external
linkage.154
- 以下任何子条款中列出的具有文件范围的每个标识符(包括
未来的库方向)被保留用作宏名称和标识符
如果包含任何关联的标头,则文件范围位于同一名称空间中。
没有保留其他标识符。如果程序在a中声明或定义了一个标识符
保留它的上下文(7.1.4 允许的除外),或定义一个保留的
标识符作为宏名称,行为未定义。
如果程序删除(用#undef
) 第一个标识符的任何宏定义
上面列出的组,行为未定义。
154) The list of reserved identifiers with external linkage includes errno
, math_errhandling
, setjmp
, and va_end
.
其他限制可能适用。例如,POSIX 标准保留了许多可能出现在正常代码中的标识符:
- 以大写字母开头的名字
E
后跟数字或大写字母:
- 可用于其他错误代码名称。
- 以以下任一开头的名称
is
or to
后面跟着一个小写字母
- 可用于附加的字符测试和转换功能。
- 以以下开头的名称
LC_
后跟一个大写字母
- 可用于指定区域设置属性的附加宏。
- 所有现有数学函数的名称以
f
or l
已保留
- 对于分别对 float 和 long double 参数进行操作的相应函数。
- 以以下开头的名称
SIG
后面跟着一个大写字母是保留的
- 获取附加信号名称。
- 以以下开头的名称
SIG_
后面跟着一个大写字母是保留的
- 用于附加信号操作。
- 名称开头为
str
, mem
, or wcs
后面跟着一个小写字母是保留的
- 用于其他字符串和数组函数。
- 名称开头为
PRI
or SCN
后跟任何小写字母或X
已保留
- 用于附加格式说明符宏
- 以以下结尾的名称
_t
已保留
- 用于其他类型名称。
虽然现在将这些名称用于您自己的目的可能不会造成问题,但它们确实会增加与该标准的未来版本发生冲突的可能性。
就我个人而言,我只是不使用下划线开头标识符。我的规则的新补充:不要在任何地方使用双下划线,这很容易,因为我很少使用下划线。
对本文进行研究后,我不再以标识符结尾_t
因为这是 POSIX 标准保留的。
关于以任何结尾的标识符的规则_t
让我很惊讶。我认为这是一个 POSIX 标准(尚未确定),正在寻求澄清和官方章节。这是来自GNU libtool 手册 http://www.gnu.org/software/libtool/manual/libc/Reserved-Names.html,列出保留名称。
CesarB 提供了以下链接POSIX 2004 http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_02.html保留符号并注释“许多其他保留前缀和后缀......可以在那里找到”。这POSIX 2008 http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html保留符号在这里定义。这些限制比上述限制更为细致。