理解glibc源代码约定
我一直在看glibc的一些源代码,特别是nptl代码,我发现它有点难以理解,因为它似乎有一些我不熟悉的约定 例如,我在看一个非常小的文件,有几件事我有疑问:理解glibc源代码约定,c,pthreads,libc,C,Pthreads,Libc,我一直在看glibc的一些源代码,特别是nptl代码,我发现它有点难以理解,因为它似乎有一些我不熟悉的约定 例如,我在看一个非常小的文件,有几件事我有疑问: 22 int 23 __pthread_equal (thread1, thread2) 24 pthread_t thread1; 25 pthread_t thread2; 26 { 27 return thread1 == thread2; 28 } 29 strong_alias (__pthread_equ
22 int
23 __pthread_equal (thread1, thread2)
24 pthread_t thread1;
25 pthread_t thread2;
26 {
27 return thread1 == thread2;
28 }
29 strong_alias (__pthread_equal, pthread_equal)
int
,然后是函数名\uuu pthread\u equal
和参数列表(thread1,thread2)
。但是第24行的声明是什么代码>和25pthread\u t thread2代码>用于?看起来这些都被声明为全局变量,但我不理解其目的。我在nptl目录中的许多文件中都看到过这种模式,但我还不知道为什么会这样做
strong\u别名
?一个快速的谷歌搜索有这样的例子,但我没有找到任何文档的链接\u pthread_equal
的类型相同,pthread_equal
该函数的编写不需要C89兼容编译器;它也适用于较旧的编译器。这是一个非原型函数定义
int /* Return type */
function(arg1, arg2) /* Function name and argument names (but no types) */
int arg1; /* Type of arg1 */
char *arg2; /* Type of arg2 */
{
/* Body of function */
}
请注意,参数的定义不必与函数行中的顺序相同(我必须将代码从这个“K&R”符号转换为原型符号,因为它们的顺序不正确!)。还请注意,过去可以简单地写:
main(argc, argv)
char **argv;
{
...
}
argc
的隐含类型是int
,因为它没有被指定为任何其他类型。glib
代码不太可能利用该许可证。类似地,main()
的返回类型是int
,因为没有给出其他类型
strong\u别名
与隐藏和公开共享库中的符号有关。我没有使用它,所以我不确定所有的结果,但我相信这意味着\uuupthread\uequal()
是pthread\uequal()函数的另一个名称
\uu pthread_equal()
名称背后的一个原因是,以下划线开头,后跟大写字母或另一个下划线的名称由C标准“保留给实现”。根据C标准,“pthread_equal()”等名称位于用户的名称空间中
ISO/IEC 9899:1990(C99标准)规定:
7.1.3保留标识符
每个标题声明或定义其关联子标题中列出的所有标识符,以及
(可选)声明或定义在其关联的未来库方向中列出的标识符
子用途和标识符,始终保留用于任何用途或用作文件
作用域标识符
-以下划线和大写字母或其他字母开头的所有标识符
下划线始终保留供任何使用
-所有以下划线开头的标识符始终保留用作标识符
文件范围在普通和标记名空间中
-以下任何子类(包括未来库)中的每个宏名称
如果包含任何相关标题,则按照规定保留使用;
除非另有明确规定(见7.1.4)
-以下任何子条款中具有外部链接的所有标识符(包括
未来库方向)始终保留用作外部库的标识符
联系(第154段)
-以下任何子条款中列出的具有文件范围的每个标识符(包括
保留将来的库方向)以用作宏名称和标识符
如果包含任何关联的标头,则文件作用域位于相同的名称空间中
没有保留其他标识符。如果程序在
保留的上下文(7.1.4允许的除外),或定义保留
标识符作为宏名称,行为未定义
154)具有外部链接的保留标识符列表包括errno
,math\u errhandling
,
setjmp
和va_end
main(argc, argv)
char **argv;
{
...
}