Три точки оператора "..." для инициализации массива - PullRequest
1 голос
/ 14 июня 2019

Рассмотрим следующий пример, который инициализирует массив значением по умолчанию:

static unsigned int array[10] = { [ 0 ... 9 ] = 5 };

Что именно делает этот оператор?

Он связан с макрокомандой variadic __VA_ARGS__?

Ответы [ 2 ]

3 голосов
/ 14 июня 2019

В стандарте C, начиная с C99, указанные инициализаторы позволяют инициализировать отдельные элементы массива в виде:

int array[4] = {[1] = 42};

Синтаксис, на который вы наткнулись, - это инициализатор диапазона, это расширение GNU для инициализации.все элементы между 0 и 9 до заданного значения, таким образом, строго эквивалентны:

static unsigned int array[10] = { [0] = 5, [1] = 5, [2] = 5, [3] = 5, [4] = 5, [5] = 5, [6] = 5, [7] = 5, [8] = 5, [9] };

только меньше бремени для ввода и чтения.

Ссылка

1 голос
/ 14 июня 2019

Ничего в ISO C. Это нестандартная конструкция.

В GNU C (gcc / clang) это , кажется, инициализирует каждый из элементов от 0 до 9 до 5 , то есть это сокращениедля (C99)

static unsigned int array[10] = { [0]=5, [1]=5, [2]=5, /*...*/ [9]=5 };

или (C89)

static unsigned int array[10] = { 5, 5, 5, 5, /*...*/ };

Расширение ... также работает для case s:

_Bool lowercase_eh(char c)
{
    switch(c) case 'a' ... 'z': return 1;
    return 0; 
}

Помимоиспользуя тот же токен ..., он не связан с переменными макросами или функциями.

...