[英]Understanding glibc source code conventions
我一直在尋找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);
不可否認的是,代碼前面有一個注釋,上面寫着“舊的清理界面”,但無論哪種方式,我都對這種差異感到好奇,為什么有時會使用一個下划線,有時會使用兩個下划線。
有關這些問題的任何信息表示贊賞。
編寫該函數時無需符合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_alias
與隱藏和公開共享庫中的符號有關。 我沒有使用它,所以我不確定所有的后果,但我相信這意味着__pthread_equal()
是pthread_equal()
函數的另一個名稱。
__pthread_equal()
名稱背后的推理的一部分是以C標准為“實現”保留以下划線后跟大寫字母或另一個下划線的名稱。 根據C標准,諸如'pthread_equal()'之類的名稱位於用戶的名稱空間中。
ISO / IEC 9899:1990(C99標准)說:
7.1.3保留標識符
每個標頭聲明或定義其關聯子條款中列出的所有標識符,並可選地聲明或定義其關聯的未來庫方向子條款和標識符中列出的標識符,這些標識符始終保留用於任何用途或用作文件范圍標識符。
- 所有以下划線開頭的標識符以及大寫字母或另一個下划線始終保留用於任何用途。
- 所有以下划線開頭的標識符始終保留用作普通和標記名稱空間中具有文件范圍的標識符。
- 如果包含任何相關標頭,則保留以下任何子條款中的每個宏名稱(包括未來的庫方向)以供指定使用; 除非另有明確說明(見7.1.4)。
- 以下任何子條款中包含外部鏈接的所有標識符(包括未來的庫方向)始終保留用作具有外部鏈接的標識符。 154)
- 如果包含任何相關標頭,則保留下列任何子條款(包括未來庫方向)中列出的具有文件范圍的每個標識符,以用作宏名稱和具有相同名稱空間的文件范圍的標識符。
沒有保留其他標識符。 如果程序在保留它的上下文中聲明或定義標識符(除了7.1.4允許的標識符),或者將保留標識符定義為宏名稱,則行為是未定義的。
154)具有外部鏈接的保留標識符列表包括
errno
,math_errhandling
,setjmp
和va_end
。
__pthread_equal
的類型, pthread_equal
要相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.