Разработанный инициализатор появился со времен ISO C99 и представляет собой другой и более динамичный способ инициализации в C при инициализации struct
, union
или array
.
Самое большое отличие от стандартной инициализации заключается в том, что вам не нужно объявлять элементы в фиксированном порядке, и вы также можете опустить элемент.
Из Руководства GNU:
Стандарт C90 требует, чтобы элементы инициализатора отображались в фиксированном порядке, таком же, как порядок элементов в инициализируемом массиве или структуре.
В ISO C99 вы можете задавать элементы в случайном порядке, указывая индексы массива или имена полей структуры, к которым они применяются, и GNU C также позволяет это как расширение в режиме C90.
Примеры
1. Индекс массива
Стандартная инициализация
int a[6] = { 0, 0, 15, 0, 29, 0 };
Разработанная инициализация
int a[6] = {[4] = 29, [2] = 15 }; // or
int a[6] = {[4]29 , [2]15 }; // or
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
2. Структура или объединение:
Стандартная инициализация
struct point { int x, y; };
Разработанная инициализация
struct point p = { .y = 2, .x = 3 }; or
struct point p = { y: 2, x: 3 };
3. Комбинируйте элементы именования с обычной C-инициализацией последовательных элементов:
Стандартная инициализация
int a[6] = { 0, v1, v2, 0, v4, 0 };
Разработанная инициализация
int a[6] = { [1] = v1, v2, [4] = v4 };
4. Другие:
Пометка элементов инициализатора массива
int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
напишите серию указателей ‘.fieldname’ и ‘[index]’ перед ‘=’, чтобы указать вложенный подобъект для инициализации
struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 };
Гиды
person
Federico Baù
schedule
03.01.2021