Was macht [ N … M ] bedeuten in C-Aggregat-Initialisierer?

Lesezeit: 2 Minuten

Benutzeravatar von Amumu
Amumu

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].

  • 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

Benutzeravatar von Alok Save
Alok Speichern

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.

  • Es scheint, dass dies nicht tragbar ist. Ist ist?

    – Ivaylo Strandjev

    9. April 2012 um 9:32 Uhr

  • @Mehrdad entspricht der Microsoft C-Compiler dem c99-Standard? Ich lasse meinen Fall hier…c99

    – Nachnix

    9. April 2012 um 9:37 Uhr


  • @Mehrdad: Eigentlich ist nur das bereichsbasierte Konstrukt von Designated Initializers eine gcc-Erweiterung. Designated Initializers selbst sind vom C-Standard erlaubt.

    – Alok Speichern

    9. April 2012 um 9:38 Uhr


  • @Mehrdad: Tut mir leid, ich möchte nicht Teil von Flammenködern sein, meine Absicht war nur, ein subtiles Detail zu klären, von dem ich dachte, dass Sie es missverstanden haben.

    – Alok Speichern

    9. April 2012 um 9:42 Uhr

  • @Mehrdad: Um es klar zu sagen, das Bereichskonstrukt ist nur für gcc (und Compiler, die seine Erweiterungen implementieren) portierbar, und bestimmte Initialisierer sind im Allgemeinen nur für Compiler portierbar, die C99 (oder zumindest diese bestimmte Funktion) unterstützen.

    – Keith Thompson

    10. April 2012 um 7:39 Uhr

1421190cookie-checkWas macht [ N … M ] bedeuten in C-Aggregat-Initialisierer?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy