23

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

4

3 回答 3

20

来自 GNU 的手册:

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

这是 C 和 C++ 供应商也使用的约定。

于 2012-05-21T14:24:16.283 回答
7

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

于 2012-05-21T14:37:52.837 回答
7

ISO 9899:2011

7.1.3 保留标识符

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

— 以下划线和大写字母或另一个下划线开头的所有标识符 始终保留用于任何用途

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

于 2012-05-21T15:31:30.087 回答