Ich habe mir den Quellcode von glibc angeschaut, insbesondere den nptl-Code, und ich fand es ein wenig schwierig zu verstehen, da er Konventionen zu haben scheint, die mir nicht bekannt sind.
Zum Beispiel habe ich mir eine sehr kleine Datei angeschaut. pthread_equal.c und es gibt ein paar Dinge, über die ich Fragen hatte:
%Vor% Die Erklärung in den Zeilen 22 und 23 sieht aus wie ich verstehe. Es hat einen Rückgabetyp von int
, dann den Funktionsnamen __pthread_equal
und die Parameterliste (thread1, thread2)
. Aber wie lauten die Deklarationen in den Zeilen 24 pthread_t thread1;
und 25 pthread_t thread2;
? Es scheint, dass diese als globale Variablen deklariert werden, aber ich verstehe den Zweck nicht. Ich habe dieses Muster in vielen Dateien im nptl-Verzeichnis gesehen und konnte nicht herausfinden, warum das so ist.
Was ist strong_alias
? Eine schnelle Google-Suche enthält Beispiele dafür, aber ich habe keinen Link zu einer Dokumentation gefunden.
Was ist der Grund dafür, dass einige Namen mit zwei Unterstrichen __
und einige mit einem Unterstrich _
vorangestellt werden? Der meiste Code, den ich gesehen habe, benutzt die zwei Unterstriche, aber ich glaube, ich habe einige Stellen gesehen, an denen ein Unterstrich verwendet wird. Zum Beispiel in pthreadP. h
Zugegebenermaßen ist diesem Code ein Kommentar vorangestellt, der "alte Bereinigungsschnittstellen" sagt, aber ich bin neugierig auf den Unterschied und warum manchmal ein Unterstrich verwendet wird und manchmal zwei Unterstriche verwendet werden.
Alle Informationen zu diesen Fragen sind willkommen.
Die Funktion wird geschrieben, ohne einen C89-konformen Compiler zu benötigen; Es wird auch mit älteren Compilern funktionieren. Das ist eine Nicht-Prototyp-Funktionsdefinition.
%Vor%Beachten Sie, dass die Definitionen der Argumente nicht in derselben Reihenfolge wie in der Funktionszeile sein müssen (ich musste Code von dieser "K & amp; R" -Notation in die Prototypnotation konvertieren, wo sie nicht in Ordnung waren! ). Beachten Sie auch, dass es früher möglich war, einfach zu schreiben:
%Vor% Der implizierte Typ für argc
war int
, da er nicht als anderer Wert angegeben wurde. Es ist unwahrscheinlich, dass der Code glib
diese Lizenz nutzt. In ähnlicher Weise war der Rückgabetyp von main()
int
, weil kein anderer Typ angegeben wurde.
strong_alias
bezieht sich auf das Ausblenden und Freigeben von Symbolen in gemeinsam genutzten Bibliotheken. Ich habe es nicht benutzt, daher bin ich mir nicht sicher, welche Auswirkungen es hat, aber ich glaube, es bedeutet, dass __pthread_equal()
ein anderer Name für die Funktion pthread_equal()
ist.
Ein Teil der Argumentation hinter dem Namen __pthread_equal()
besteht darin, dass Namen, die mit einem Unterstrich gefolgt von einem Großbuchstaben oder einem anderen Unterstrich beginnen, vom C-Standard für die Implementierung reserviert sind. Namen wie 'pthread_equal ()' sind im Namensraum des Benutzers entsprechend dem C-Standard.
ISO / IEC 9899: 1990 (der C99-Standard) sagt:
7.1.3 Reservierte Identifikatoren
Jede Kopfzeile deklariert oder definiert alle Bezeichner, die in der zugehörigen Unterklausel aufgelistet sind, und optional deklariert oder definiert Bezeichner, die in den zugehörigen zukünftigen Bibliotheksanweisungen aufgeführt sind Unterklauseln und Bezeichner, die immer für die Verwendung oder zur Verwendung als Datei reserviert sind Bereichsbezeichner.
- Alle Bezeichner, die mit einem Unterstrich und einem Großbuchstaben oder einem anderen beginnen Unterstriche sind immer für jede Verwendung reserviert.
- Alle Bezeichner, die mit einem Unterstrich beginnen, sind immer für die Verwendung als Bezeichner reserviert mit dem Dateibereich sowohl im normalen als auch im Tag-Namensraum.
- Jeder Makroname in einem der folgenden Unterklauseln (einschließlich der zukünftigen Bibliothek) Richtungen) ist für die Verwendung wie angegeben reserviert, wenn einer der zugehörigen Header enthalten ist; sofern nicht ausdrücklich anders angegeben (siehe 7.1.4).
- Alle Bezeichner mit externer Verknüpfung in einem der folgenden Unterklauseln (einschließlich der zukünftige Bibliotheksanweisungen) sind immer für die Verwendung als Kennungen mit externen reserviert Verbindung. 154
- Jeder Bezeichner mit Dateiumfang, der in einem der folgenden Abschnitte aufgeführt ist (einschließlich der zukünftige Bibliotheksanweisungen) ist für die Verwendung als Makroname und als Bezeichner mit Dateibereich im selben Namensraum, wenn einer der zugehörigen Header enthalten ist.
Keine anderen Kennungen sind reserviert. Wenn das Programm einen Bezeichner in a deklariert oder definiert Kontext, in dem es reserviert ist (anders als in 7.1.4 erlaubt) oder definiert ein reserviertes Bezeichner als Makroname, das Verhalten ist nicht definiert.
154) Die Liste der reservierten Bezeichner mit externer Verknüpfung enthält
errno
,math_errhandling
,setjmp
undva_end
.