在标准库(glibc)中,我看到使用前导双下划线定义的函数,例如__mmap
中的sys/mman.h
。什么目的?我们怎样才能调用一个似乎没有在任何地方声明的函数mmap
。我的意思是我们包含sys/mman.h
,但sys/mman.h
未声明mmap
,它仅声明__mmap
。
答案 0 :(得分:17)
来自GNU的手册:
除了本手册中记录的名称外,还有保留名称 包括所有外部标识符(全局函数和变量) 以下划线('_')和所有标识符开头,不管用途如何 以两个下划线或下划线后跟一个开头 大写字母是保留名称。这是图书馆和 头文件可以为内部定义函数,变量和宏 目的,没有与用户程序中的名称冲突的风险。
这是C和C ++供应商也使用的惯例。
答案 1 :(得分:7)
带有前导双下划线的名称保留供实现内部使用(编译器/标准库/等)。它们永远不会出现在您的代码中。这个保留命名空间的目的是为它们提供可以使用的系统头文件名,而不会与程序中使用的名称发生冲突。
答案 2 :(得分:7)
ISO 9899:2011
7.1.3保留标识符
每个标头声明或定义其中列出的所有标识符 相关子条款,并可选择声明或定义标识符 列在其相关的未来图书馆方向子条款和 标识符,总是保留用于任何用途或用作 文件范围标识符。
- 所有以。开头的标识符 下划线,或者是大写字母或另一个下划线 始终保留用于任何用途。
- 所有以。开头的标识符 下划线始终保留用作具有文件范围的标识符 在普通名称和标签名称空间中。