以两个下划线或下划线和大写字母开头的标识符由C标准保留,不应在您自己的代码中使用,参见 ISO 9899:2011§7.1.31#1:
7.1.3保留标识符
1每个标头声明或定义其关联子条款中列出的所有标识符,并可选地声明或定义其关联的未来库方向子条款和标识符中列出的标识符,这些标识符始终保留用于任何用途或用作文件范围标识符.
- 所有以下划线开头的标识符以及大写字母或另一个下划线始终保留用于任何用途.
- 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符.
- 如果包含任何相关标头,则保留以下任何子条款中的每个宏名称(包括未来的库方向)以供指定使用; 除非另有明确说明(见7.1.4).
- 具有外部链接的所有标识符在以下任何子条款中(包括未来的库方向)并
errno
始终保留用作具有外部链接的标识符.184)- 在以下任何子条款中列出的具有文件范围的每个标识符(包括未来的库方向)保留用作宏名称,并且如果包括任何相关联的标题,则用作具有相同名称空间的文件范围的标识符.
2未保留其他标识符.如果程序在保留它的上下文中声明或定义标识符(除了7.1.4允许的标识符),或者将保留标识符定义为宏名称,则行为是未定义的.
3如果程序删除(使用
#undef
)上面列出的第一个组中的标识符的任何宏定义,则行为未定义.
184)与外部连接保留的标识符的列表包括
math_errhandling
,setjm
,va_copy
,和va_end
.
对于名称中的双下划线:这些很难区分许多字体中的单个下划线并导致混淆.我建议你不要那样做.