开头的双下划线的含义

时间:2012-05-21 14:20:29

标签: c linux gcc x86-64 glibc

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

3 个答案:

答案 0 :(得分:17)

来自GNU的手册:

  

除了本手册中记录的名称外,还有保留名称   包括所有外部标识符(全局函数和变量)   以下划线('_')和所有标识符开头,不管用途如何   以两个下划线或下划线后跟一个开头   大写字母是保留名称。这是图书馆和   头文件可以为内部定义函数,变量和宏   目的,没有与用户程序中的名称冲突的风险。

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

答案 1 :(得分:7)

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

答案 2 :(得分:7)

ISO 9899:2011

  

7.1.3保留标识符

     

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

     

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

     

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