2015-11-17 4 views
9

В ядре Linux, я вижу декларацию массива структур, который выглядит, как этотC массив структур декларации

struct SomeStructName [] ={ 
[SOMEWEIRD_NAME] = { 
        .field1 = "some value" 
        }, 
[SOMEWEIRD_NAME2] = { 
        .field1 = "some value1" 
        }, 
} 

Я никогда не видел заявление, как это, в частности, я не могу понять, что [SOMEWEIRD_NAME] означает, и почему он используется.

+3

Это расширение GNU для [назначенных инициализаторах] (https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html). – Kninnug

+0

@Kninnug это не расширение GNU, оно действительно C99 – ouah

+0

@ouah Я думал, что C99 разрешает синтаксис '.field'. Кажется, я ошибался, хотя GCC имеет некоторый дополнительный синтаксис не в стандарте. – Kninnug

ответ

5

Это C99 designated initializer для массивов.

Например:

/* 
* Initialize element 0 to 1 
*      1 to 2 
*      2 to 3 
*     255 to 1 
* and all other elements to 0 
*/ 
int arr[256] = {[0] = 1, 2, 3, [255] = 1}; 

Это позволяет инициализировать некоторые специфические элементы массива в любом порядке, а также позволяет исключить некоторые элементы.

В вашем примере выражение между [] может быть именем макроса для целочисленного константного выражения или константой enum. Он не может быть именем переменной, поскольку он должен быть целым постоянным выражением.

1

«SOMEWEIRD_NAME», скорее всего, либо #define, чье значение является числом, либо оно является перечислением, числовым значением которого является его позиция в перечислении.

+0

Да, в моем случае это было перечисление, которое компилятором интерпретируется как целое, поэтому SOMEWEIRD_NAME превращается в 0 –

2

Я не уверен, что вы имели в виду, но я предполагаю, что SOMEWEIRD_NAME является определяющим значением.

Определить способ дать значения другому имени, но он не займет пробел в вашем запоминающем устройстве во время выполнения, insted, он будет заменен повсеместно. Имя этих определенных значений записывается в вашем коде во время компиляции профайлов.

Синтаксис deifne как следующее: #define NAME_OF_DEFINE 80 в следующем примере каждый NAME_OF_DEFINE в коде будет заменен йотой значения от 80. Обратите внимание, что вы не должны закончить линию йоты ;.

В вашем примере я ожидаю, что SOMEWEIRD_NAME будет иметь значение numbric для установки размера массива.

ожно больше информации о #definehere

Смежные вопросы