双重下划线的含义在一开始

在标准库(glibc)中,我们可以看到使用前两个下划线定义的函数,例如sys/mman.h __mmap 。 什么目的? 而且我们怎样才能调用一个函数mmap ,这个函数似乎没有在任何地方声明。 我的意思是我们包含sys/mman.h ,但是sys/mman.h不声明mmap ,它只声明__mmap

Solutions Collecting From Web of "双重下划线的含义在一开始"

从GNU手册:

除了本手册中记载的名称之外,保留名称还包括以下划线('_')开头的所有外部标识符(全局函数和变量),以及所有标识符,不管以两个下划线或下划线开头,后跟一个大写字母是保留的名字。 这样,库和头文件就可以为内部目的定义函数,变量和宏,而不会与用户程序中的名称发生冲突。

这是C和C ++供应商也使用的惯例。

ISO 9899:2011

7.1.3保留的标识符

每个头部声明或定义在其相关的子条款中列出的所有标识符,并且可选地声明或定义在其相关联的未来库方向子条款中列出的标识符,以及总是保留用于任何用途或用作文件范围标识符的标识符。

– 所有以下划线开头并以大写字母或下划线开头的标识符总是保留用于任何用途

– 以下划线开始的所有标识符始终保留用作普通标签名称空间和标签名称空间中具有文件范围的标识符。

带有双下划线的名称保留供实现(编译器/标准库/等)内部使用。 他们不应该出现在你的代码中。 这个保留的命名空间的目的是为了给它们可以使用的系统头名称,而不会与你程序中使用的名字发生冲突。