Aus sys.c Zeile 123:
void *sys_call_table[__NR_syscalls] =
{
[0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};
sys_call_table
ist ein generischer Zeiger auf Arrays, das kann ich sehen. Aber was ist die Notation:
[0 ... __NR_syscalls-1]
Was ist der ...
?
BEARBEITEN:
Ich habe hier einen weiteren C-Trick gelernt: #include <asm/unistd.h>
wird sein vorverarbeitet und durch seinen Inhalt ersetzt und zugeordnet [0 ... _NR_syscalls-1]
.
Es ist die Initialisierung mit Ausgewiesene Initialisierer.
Die bereichsbasierte Initialisierung ist eine gnu gcc-Erweiterung.
Um eine Reihe von Elementen mit demselben Wert zu initialisieren, schreiben Sie [first ... last] = value
. Dies ist eine GNU-Erweiterung. Zum Beispiel,
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
Es ist nicht tragbar. Kompilieren mit -pedantic
mit dir sagen.
Wie funktioniert es hier?
Der Präprozessor ersetzt #include <asm/unistd.h>
mit seinem eigentlichen Inhalt (es definiert verschiedene symbolische Konstanten und Typen und deklariert verschiedene Funktionen) im bereichsbasierten Konstrukt, die dann weiter zum Initialisieren des Arrays von Zeigern verwendet werden.
Nein, es ist kein Zeiger auf ein Array, es ist ein Array von Zeigern. Ein Zeiger auf ein Array würde deklariert werden
void (*sys_call_table)[__NR_syscalls]
– Patrick Schlüter
10. April 2012 um 14:34 Uhr
@tristopia du hast recht. Was ich meinte, war ein Zeiger auf Arrays, ähnlich wie
char *argv[]
. Fest.– Amumu
10. April 2012 um 14:48 Uhr