在标准库(glibc的)我看到与领先的双下划线,如定义的函数__mmap
在sys/mman.h
。 什么目的? 而且我们还怎么调用一个函数mmap
这似乎并没有在任何地方声明。 我的意思是,我们包括sys/mman.h
对于这一点,但sys/mman.h
没有声明mmap
,它宣称只有__mmap
。
Answer 1:
从GNU手册:
除了本说明书中记载的姓名,保留的名称包括所有外部标识符(全局变量和函数)以下划线(“_”)开始,所有的标识符不管用与任一两个下划线或下划线后跟一个开始的大写字母是保留名称。 这是为了让库和头文件可以定义函数,变量和内部用途宏而不与用户程序的名称冲突的风险。
这是也使用C和C ++厂商的公约。
Answer 2:
与领先的双下划线的名称被保留用于实施内部使用(编译/标准库/等)。 他们从来不应该出现在你的代码。 该保留的命名空间的目的是让他们可以使用系统的头名,而无需在程序中使用的名称可能发生冲突。
Answer 3:
ISO 9899:2011
7.1.3保留标识符
每个报头声明或定义在其相关联的子条款中列出的所有的标识符,并且任选地声明或定义在其相关联的未来图书馆方向节列出和标识符,该标识符,始终保留要么用于任何用途或用作文件范围标识符的标识符。
-以下划线和一个大写字母或另一个下划线开头的所有标识符, 始终保留用于任何用途 。
- 以下划线开头的所有标识符,始终保留用作与两个普通和标记的名称空间文件范围的标识符。
文章来源: Meaning of double underscore in the beginning