nul*_*ptr 4 c linux naming-conventions
带有下划线“_”前缀的一般用途是指示该实例是通常不(或不应该)直接使用的内部功能。在 C 中,这也用于防止全局范围内的命名冲突。
但是,我的问题是什么决定了使用的下划线的数量?例如,在 Linux 内核中,我们可以看到'_tmp' (一个下划线)、'__cacheline_aligned' (两个下划线)和'____cacheline_aligned' (四个下划线)的实例。
我的一个想法是,例如,如果一个长内部函数(以下划线前缀)在内部使用另一个函数,则后者将以两个下划线为前缀。
以双下划线开头的标识符由 C 编程语言规范保留。这意味着,定义自己的以双下划线开头的标识符是非法的。(这同样适用于以单个下划线后跟大写字母开头的标识符。)
因此,从技术上讲,这意味着 Linux 内核的源代码不是符合标准的 C 代码。
然而,Linux 内核是非常低级的代码,只能使用少数特定版本的 C 编译器进行编译,因此,Linux 内核开发人员确切地知道__foo编译器使用了哪些标识符以及自己可以使用哪些标识符。
因此,Linux 内核使用以双下划线开头的标识符,其原因与 C 标准禁止它们的原因相同:为了确保不会与用户定义的标识符发生冲突。
例如,一些 Linux 内核头文件最终被包含在低级系统库(GNU libc、musl、dietlibc 等)中,并且使用显式保留的标识符保证这不会导致冲突。