O que significa [N… M] em inicializadores de agregado C?

101

Da linha 123 sys.c :

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

sys_call_tableé um ponteiro genérico para matrizes, posso ver isso. No entanto, qual é a notação:

[0 ... __NR_syscalls-1]

O que é ...?


EDIT:
eu aprendi outro truque C aqui: #include <asm/unistd.h>será pré - processado e substituído com seu conteúdo e atribuído a [0 ... _NR_syscalls-1].

Amumu
fonte
2
Não, não é um ponteiro para um array, é um array de ponteiros. Um ponteiro para uma matriz seria declaradovoid (*sys_call_table)[__NR_syscalls]
Patrick Schlüter
@tristopia você está certo. O que eu quis dizer é um ponteiro para matrizes, semelhante a char *argv[]. Fixo.
Amumu de

Respostas:

90

É a inicialização usando inicializadores designados .

A inicialização baseada em intervalo é uma extensão gnu gcc.

Para inicializar uma série de elementos com o mesmo valor, escreva [first ... last] = value. Esta é uma extensão GNU. Por exemplo,

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

Não é portátil. Compilar com -pedanticte digo isso.

Como funciona aqui?
O pré-processador substitui #include <asm/unistd.h>com seu conteúdo real ( ele define diversos tipos e constantes simbólicas e declara funções diversas ) na construção baseada em intervalo, que é então usada posteriormente para inicializar a matriz de ponteiros.

Alok Save
fonte
Parece que não é portátil. É é?
Ivaylo Strandjev,
5
@Mehrdad o compilador microsoft c está em conformidade com o padrão c99? Eu encerro
Aftnix
3
@Mehrdad: Na verdade, apenas a construção baseada em intervalo dos Inicializadores designados é uma extensão gcc. Os próprios inicializadores designados são permitidos pelo padrão C.
Alok Save
2
@Mehrdad: Desculpe, não desejo fazer parte de nenhuma isca de fogo, minha intenção era apenas esclarecer um detalhe sutil que pensei que você não entendeu.
Alok Save
2
@Mehrdad: Para ser claro, a construção de intervalo portátil apenas para gcc (e compiladores que implementam suas extensões), e inicializadores designados em geral são portáveis ​​apenas para compiladores que suportam C99 (ou pelo menos aquele recurso específico).
Keith Thompson,