我一直在查看glibc的一些源代码,特别是nptl代码,但由于它似乎有我不熟悉的约定,所以我发现有点难以理解。
例如,我正在查看一个非常小的文件pthread_equal.c,其中有一些问题:
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)
在22和23行的声明看起来很容易理解。它具有返回类型为
int
的函数名__pthread_equal
和参数列表(thread1,thread2)
。但是,第24行的pthread_t thread1;
和第25行的pthread_t thread2;
声明是用于什么目的呢?似乎这些被声明为全局变量,但我不明白其目的。在nptl目录中的许多文件中都看到了这种模式,但一直无法弄清楚为什么要这样做。strong_alias
是什么?快速的谷歌搜索可以找到使用的示例,但没有找到任何文档链接。为什么有些名称前面要加上两个下划线
__
,而有些名称只需要一个下划线_
?我看到的大部分代码都使用两个下划线,但我认为我已经看到某些地方使用了一个下划线。例如,在pthreadP.h中。
556 /* Old cleanup interfaces, still used in libc.so. */
557 extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
558 void (*routine) (void *), void *arg);
559 extern void _pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer,
560 int execute);
561 extern void _pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer,
562 void (*routine) (void *), void *arg);
563 extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer,
564 int execute);
承认该代码有一个注释,称为“旧清理接口”,但无论如何,我很好奇它们之间的区别以及为什么有时会使用一个下划线,有时会使用两个下划线。
任何有关这些问题的信息都将不胜感激。