Linux 内核编程中的前导下划线

nul*_*ptr 4 c linux naming-conventions

带有下划线“_”前缀的一般用途是指示该实例是通常不(或不应该)直接使用的内部功能。在 C 中,这也用于防止全局范围内的命名冲突。

但是,我的问题是什么决定了使用的下划线的数量?例如,在 Linux 内核中,我们可以看到'_tmp' (一个下划线)'__cacheline_aligned' (两个下划线)'____cacheline_aligned' (四个下划线)的实例。

我的一个想法是,例如,如果一个长内部函数(以下划线前缀)在内部使用另一个函数,则后者将以两个下划线为前缀。

Jör*_*tag 5

以双下划线开头的标识符由 C 编程语言规范保留。这意味着,定义自己的以双下划线开头的标识符是非法的。(这同样适用于以单个下划线后跟大写字母开头的标识符。)

因此,从技术上讲,这意味着 Linux 内核的源代码不是符合标准的 C 代码。

然而,Linux 内核是非常低级的代码,只能使用少数特定版本的 C 编译器进行编译,因此,Linux 内核开发人员确切地知道__foo编译器使用了哪些标识符以及自己可以使用哪些标识符。

因此,Linux 内核使用以双下划线开头的标识符,其原因与 C 标准禁止它们的原因相同:为了确保不会与用户定义的标识符发生冲突。

例如,一些 Linux 内核头文件最终被包含在低级系统库(GNU libc、musl、dietlibc 等)中,并且使用显式保留的标识符保证这不会导致冲突。

  • 感谢@Jörg W Mittag 的回答。但是,这并没有回答我原来的问题,即是什么决定了使用的下划线数量?为什么 Linux 内核程序员有时会使用一个下划线、两个下划线和四个下划线?是否有关于此的特定编码约定? (3认同)