В чем смысл следующего кода? Код из набора регрессионных тестов GCC.
static char * name[] = {
[0x80000000] = "bar"
};
В чем смысл следующего кода? Код из набора регрессионных тестов GCC.
static char * name[] = {
[0x80000000] = "bar"
};
В C99 вы можете указать индексы массива для назначенного значения, например:
static char * name[] = {
[3] = "bar"
};
совпадает с:
static char * name[] = { NULL, NULL, NULL, "bar"};
Размер массива равен 4. Проверьте пример кода, работающего в ideaone. В вашем размере массива кода 0x80000001
(его шестнадцатеричное число).
Примечание. Неинициализированные элементы инициализируются с помощью 0
.
5.20 Назначенные инициализаторы:
В ISO C99 вы можете указать элементы в любом порядке, указав индексы массива или имена полей структуры, к которым они применяются, и GNU C разрешает это как расширение в режиме C89. Это расширение не реализовано в GNU С++. Чтобы указать индекс массива, напишите
[index] =
до значения элемента. Например,int a[6] = { [4] = 29, [2] = 15 };
эквивалентно
int a[6] = { 0, 0, 15, 0, 29, 0 };
В расширении GNU возможно еще одно интересное объявление:
Альтернативный синтаксис для этого, который устарел, поскольку GCC 2.5, но GCC по-прежнему принимает, заключается в том, чтобы написать
[index]
до значения элемента без=
.Чтобы инициализировать диапазон элементов для одного и того же значения, напишите
[first ... last] = value
. Например,int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
Примечание:, что длина массива - это самое высокое значение, указанное плюс один.
Кроме того, мы можем комбинировать эту технику именования с обычной инициализацией C последовательных элементов. Каждый элемент инициализатора, который не имеет указателя, применяется к следующему последовательному элементу массива или структуры. Например:
int a[6] = { [1] = v1, v2, [4] = v4 };
эквивалентно
int a[6] = { 0, v1, v2, 0, v4, 0 };
Маркировка элементов инициализатора массива особенно полезна, когда индексы являются символами или принадлежат типу перечисления. Например:
int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
['\f'] = 1, ['\n'] = 1, ['\r'] = 1
};
Он назвал назначенный инициализатор, который введен в C99, gcc также поддерживает его в GNU89 как расширение, см. здесь для деталей.
int a[6] = { [4] = 29, [2] = 15 };
эквивалентно
int a[6] = { 0, 0, 15, 0, 29, 0 };
Это назначенный инициализатор C99. значение в скобках указывает индекс для получения значения.