【问题标题】:Meaning of double underscore in the beginning开头双下划线的含义
【发布时间】:2012-05-28 01:26:18
【问题描述】:

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

【问题讨论】:

  • 双下划线:stackoverflow.com/questions/224397/…(问题是 C++,但 __ 也来自 ANSI C 标准)。同样在我的sys/mman.h 版本中,定义了mmap
  • __mmap 没有在 glibc 的任何地方声明。不知道你在说什么。
  • 你在看内核头文件,而不是 glibc 头文件?

标签: c linux gcc x86-64 glibc


【解决方案1】:

来自 GNU 手册:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我喜欢你对我很好的回答。
    【解决方案3】:

    ISO 9899:2011

    7.1.3 保留标识符

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

    ——所有以 下划线和大写字母或另一个下划线是 始终保留用于任何用途

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

    【讨论】:

      猜你喜欢
      • 2014-12-13
      • 2020-01-04
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多