2012-05-21 66 views
19

在标准库(glibc)中,我看到用前导双下划线定义的函数,例如sys/mman.h中的__mmap。什么目的?我们又如何调用一个函数mmap,这个函数似乎没有在任何地方声明。我的意思是我们包括sys/mman.h那,但sys/mman.h不宣布mmap,它只宣布__mmap开头的双下划线的含义

+3

双下划线:http://stackoverflow.com/questions/224397/why-do-people-use-double-underscore-so-much-in-c(问题是说C++,但'__'是也来自ANSI C标准)。同样在我的'sys/mman.h'版本中,定义了'mmap'。 – birryree

+0

'__mmap'没有被glibc声明。不知道你在说什么。 –

+0

你在看内核头文件,而不是glibc头文件吗? –

回答

16

从GNU手册:

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

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

5

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

+0

我喜欢你的回答,对我很友善。 –

6

ISO 9899:2011

7.1.3保留标识符

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

- 这与 下划线和大写字母或另一个下划线开头的所有标识符 总是保留用于任何用途

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