Cosa significa [N… M] negli inizializzatori aggregati C?


101

Dalla riga 123 di sys.c :

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

sys_call_tableè un puntatore generico agli array, lo vedo. Tuttavia qual è la notazione:

[0 ... __NR_syscalls-1]

Qual è il ...?


EDIT:
ho imparato un altro trucco C qui: #include <asm/unistd.h>sarà preelaborato e sostituito con il suo contenuto e assegnato a [0 ... _NR_syscalls-1].


2
No, non è un puntatore a un array, è un array di puntatori. Verrà dichiarato un puntatore a un arrayvoid (*sys_call_table)[__NR_syscalls]
Patrick Schlüter

@tristopia hai ragione. Quello che volevo dire era un puntatore ad array, simile a char *argv[]. Fisso.
Amumu

Risposte:


90

È l'inizializzazione che utilizza gli inizializzatori designati .

L'inizializzazione basata su intervallo è un'estensione gnu gcc.

Per inizializzare un intervallo di elementi con lo stesso valore, scrivi [first ... last] = value. Questa è un'estensione GNU. Per esempio,

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

Non è portatile. Compilando con -pedanticcon te lo dico.

Come funziona qui?
Il preprocessore sostituisce #include <asm/unistd.h>con il suo contenuto effettivo ( definisce costanti e tipi simbolici miscellanei e dichiara funzioni miscellanee ) nel costrutto basato su intervallo, che viene quindi ulteriormente utilizzato per inizializzare l'array di puntatori.


Sembra che questo non sia portatile. È?
Ivaylo Strandjev

5
@ Mehrdad il compilatore microsoft c è conforme allo standard c99? Riposo qui il mio caso ... c99
Aftnix

3
@ Mehrdad: In realtà, solo il costrutto basato su intervallo di Designated Initializers è un'estensione gcc. Gli stessi Initializer designati sono consentiti dallo standard C.
Alok Save

2
@ Mehrdad: Scusa, non desidero far parte di nessuna esca di fiamma, la mia intenzione era solo quella di chiarire un sottile dettaglio che pensavo avessi frainteso.
Alok Save

2
@ Mehrdad: Per essere chiari, il costrutto di intervallo portabile solo su gcc (e compilatori che implementano le sue estensioni), e gli inizializzatori designati in generale sono portabili solo su compilatori che supportano C99 (o almeno quella particolare caratteristica).
Keith Thompson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.