Que signifie [N… M] dans les initialiseurs d'agrégats C?

101

À partir de la ligne 123 de sys.c :

void *sys_call_table[__NR_syscalls] = 
{
    [0 ... __NR_syscalls-1] = sys_ni_syscall,
#include <asm/unistd.h>
};

sys_call_tableest un pointeur générique vers des tableaux, je peux le voir. Cependant quelle est la notation:

[0 ... __NR_syscalls-1]

Quel est le ...?


EDIT:
J'ai appris une autre astuce C ici: #include <asm/unistd.h>sera prétraité et remplacé par son contenu et assigné à [0 ... _NR_syscalls-1].

Amumu
la source
2
Non, ce n'est pas un pointeur vers un tableau, c'est un tableau de pointeurs. Un pointeur vers un tableau serait déclarévoid (*sys_call_table)[__NR_syscalls]
Patrick Schlüter
@tristopia vous avez raison. Ce que je voulais dire, c'était un pointeur vers des tableaux, similaire à char *argv[]. Fixé.
Amumu

Réponses:

90

Il s'agit d'une initialisation à l'aide d'initialiseurs désignés .

L'initialisation basée sur la plage est une extension gnu gcc.

Pour initialiser une plage d'éléments à la même valeur, écrivez [first ... last] = value. Ceci est une extension GNU. Par exemple,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

Ce n'est pas portable. Compiler avec -pedanticavec vous le dis.

Comment ça marche ici?
Le préprocesseur remplace #include <asm/unistd.h>par son contenu réel ( il définit diverses constantes et types symboliques et déclare des fonctions diverses ) dans la construction basée sur la plage, qui est ensuite utilisée pour initialiser le tableau de pointeurs.

Alok Save
la source
Il semble que ce ne soit pas portable. Est-ce que c'est?
Ivaylo Strandjev
5
@Mehrdad est-ce que le compilateur Microsoft C est conforme à la norme C99? Je repose mon affaire ici ... c99
Aftnix
3
@Mehrdad: En fait, seule la construction basée sur la plage des initialiseurs désignés est une extension gcc. Les initialiseurs désignés eux-mêmes sont autorisés par le standard C.
Alok Save le
2
@Mehrdad: Désolé, je ne souhaite faire partie d'aucun appât à flamme, mon intention était seulement de clarifier un détail subtil que je pensais que vous aviez mal compris.
Alok Enregistrer le
2
@Mehrdad: Pour être clair, la construction de plage est portable uniquement pour gcc (et les compilateurs qui implémentent ses extensions), et les initialiseurs désignés en général ne sont portables que pour les compilateurs qui supportent C99 (ou du moins cette fonctionnalité particulière).
Keith Thompson