Что означает каждая фигурная скобка при объявлении / инициализации структуры? (предупреждение: пропущены фигурные скобки вокруг инициализатора [-Wmissing-фигурные скобки]) - PullRequest
0 голосов
/ 31 октября 2018

Я наткнулся на следующую структуру:

static struct {
    unsigned char a[5];
} b[] = {       
        {1,1,1,1,1},
        {2,2,2,2,2}
};

Однако, если он компилируется, я получаю следующее предупреждение «предупреждение: пропущены фигурные скобки вокруг инициализатора [-Wmissing-braces]».

Если я изменю это так:

static struct {
    unsigned char a[5];
} b[] = {       
        {{1,1,1,1,1}},
        {{2,2,2,2,2}}
};

Тогда предупреждение исчезло. Что означает каждая фигурная скобка после "b [] ="? Внутренние фигурные скобки, очевидно,? расшифровывается как инициализация char a [5]. Но за что стоят другие брекеты? Очевидно? одна из других фигурных скобок должна учитывать структурный массив b [], но какой? И почему, как кажется, нужна третья фигурная скобка и для чего она нужна? Это смущает меня.

Ответы [ 5 ]

0 голосов
/ 31 октября 2018
static struct {
    unsigned char a[5];
} b[] = {                 // array b
        {                 // struct
        {                 // array a
          1,1,1,1,1}},
        {                 // another struct
        {2,2,2,2,2}}
};
0 голосов
/ 31 октября 2018

{1,1,1,1,1} - пять элементов массива.

{{1,1,1,1,1}} - Это то, как вы инициализируете структуру с полем, которое в данном случае является массивом из пяти int.

{{{1,1,1,1,1}}, {{2,2,2,2,2}}} - это массив из двух элементов. Где каждый элемент является экземпляром структуры, как указано выше.

0 голосов
/ 31 октября 2018

Каждая фигурная скобка соответствует началу подобъекта (объекта внутри агрегатного объекта, такого как массив или структура).

b[] - это массив, поэтому первая фигурная скобка вводит элементы массива.

Каждый b является структурой, поэтому следующая фигурная скобка представляет членов структуры.

Элемент a внутри b является массивом, поэтому следующие скобки вводят элементы этого массива.

0 голосов
/ 31 октября 2018
int a[2] = { 1, 2 };

Ok. Теперь это:

int a[2][2] = { { 1, 2 } , { 3, 4 } };

Правильно? a[0][0] = 1 и a[0][1] = 2 и a[1][0] = 3 и a[1][1] = 4. a[0] - это memcmp, равный (int[]){ 1, 2 }, а a[1] - это memcmp, равный (int[]){ 3, 4 }.

Теперь вот это:

struct {
     int a[2];
} b = { { 1, 2 } };

Итак, первый { } обозначает инициализацию структуры, а внутренний - b.a. Сейчас мы создаем массив структур:

struct b_s {
     int a[2];
} b[] = { 
      {
         { 1, 2 },
      },{ 
         { 3, 4, }
      },
};

Итак, первые фигурные скобки означают инициализацию массива b[]. Второй предназначен для инициализации структуры b[0]. Третий - инициализация массива b[0].a.

b[0] - это memcmp, равное &(struct b_s){ {1, 2 } }. b[0].a - это memcmp, равный (int[2]){ 1, 2 }. b[0].a[0] равно 1.

0 голосов
/ 31 октября 2018

У вас есть массив из структур , содержащий массивов . Три пары брекетов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...