> Wofür stehen diese ganzen _ oder ?
Erst einmal sind das ganz normale gültige Zeichen in Bezeichnern der
Sprache C (also Namen von Makros, Funktionen, Funktionsparametern,
Variablen, ...). Namen die mit einem oder zwei Unterstrichen beginnen
haben aber per Dekret (des C-Standards) eine Besonderheit: sie sind
reserviert "for the implementation", d.h. für den Compiler und die
Standardbibliothek. Damit verhindert man, dass diese Namen mit
gültigen Namen in der Applikation kollidieren können (da Applikationen
selbst derartige Namen nicht von sich aus benutzen/erfinden dürfen).
Um's mal anschaulich zu machen, stell dir vor, ein Headerfile der
Systembibliothek (sagen wir, <foo.h>) hätte folgenden
Funktionsprototypen deklariert:
1 | int dosomething(int x, int y);
|
Jetzt kommt eine Applikation und schreibt
1 | #define x 800 /* X-Aufloesung */
|
2 | #define y 600 /* Y-Aufloesung */
|
3 |
|
4 | #include <foo.h>
|
5 |
|
6 | ...
|
Was passiert dann? Nach dem Präprozessor sieht das dann für den
Compiler so aus:
1 | int dosomething(int 800 , int 600 );
|
...was offensichtlich kein sinnvoller oder gültiger Funktionsprototyp
mehr ist. Daher muss foo.h stattdessen schreiben:
1 | int dosomething(int __x, int __y);
|
Da die Bezeichner __x und __y "reserved for the implementation" sind,
darf die Applikation sie selbst in keiner Weise bereits definiert
haben. Damit lässt sich das Ganze ordentlich compilieren, egal was
die Applikation an legalen Makros bereits selbst definiert hat.
Aber wie andere schon schrieben: ich würde nicht mit dem Studium der
Headerfiles der Systembibliotheken beginnen. Bibliotheken schreibt
man so, dass sie unter allen möglichen Randbedingungen gut
funktionieren, dass sie möglichst flexibel sind, ggf. verwenden sie
allerlei Compilertricks (inline asm, beim GCC irgendwelche
__attribute__-Dinge), um spezielle Ziele zu erreichen (und sei's nur
optimaler Code), das erschwert alles das Verständnis. Das Ziel einer
Bibliothek ist ja eine gute Benutzbarkeit.
Nimm dir Beispielcode.