﻿# V2624\. MISRA\. The initializer for an aggregate or union should be enclosed in braces\.

Данное диагностическое правило основано на руководстве [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Это правило актуально только для C\. Оно требует, чтобы инициализаторы для агрегатов и объединений оборачивались в фигурные скобки\. Правило применимо как для объектов, так и для всех подобъектов\.

Исключения:

* Для инициализации подобъектов используется инициализатор в виде '\{ 0 \}'\.
* Массив инициализируется через строковый литерал\.
* Структура или объединение с automatic storage duration инициализируется через выражение, совместимое со структурой или объединением\.
* Для инициализации части подобъекта используется назначенная \(designated\) инициализация\.

Рассмотрим пример:

```cpp
int num[3][2] = { 1, 2, 3, 4, 5, 6 };
```

В данном коде представлены инициализаторы массива, которые не оборачиваются в фигурные скобки\. Корректный код:

```cpp
int num[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };
```

Рассмотрим ещё один пример:

```cpp
struct S1
{
  char buf;
  int num[3][2];

} s1[4] = { 
        'a', { 1, 2 }, { 0, 0 }, { 5, 6 },
        'b', { 1, 2 }, { 0, 0 }, { 5, 6 },
        'c', { 1, 2 }, { 0, 0 }, { 5, 6 },
        'd', { 1, 2 }, { 0, 0 }, { 5, 6 }
};
```

Правило требует, чтобы инициализаторы агрегатов также оборачивались в фигурные скобки\. Корректный код будет выглядеть так:

```cpp
struct S1
{
  char buf;
  int num [3][2];

} s1[4] = {
        { 'a', { { 1, 2 }, { 0, 0 }, { 5, 6 } } },
        { 'b', { { 1, 2 }, { 0, 0 }, { 5, 6 } } },
        { 'c', { { 1, 2 }, { 0, 0 }, { 5, 6 } } },
        { 'd', { { 1, 2 }, { 0, 0 }, { 5, 6 } } }
};
```

Рассмотрим вот такой случай:

```cpp
struct S2 {
  char color[8];
  int num;
} s2[3] = {
        { "Red",   1 },
        { "Green", 2 },
        { "Blue",  3 }
};
```

В данном примере символьный литерал также должен оборачиваться в фигурные скобки\. Корректный код:

```cpp
struct S2 {
  char color[8];
  int num;
} s2[3] = {
        { { "Red" },   1 },
        { { "Green" }, 2 },
        { { "Blue" },  3 }
};
```

Пример кода с назначенными \(designated\) инициализаторами:

```cpp
int num[2][2] = { [0][1] = 0, { 0, 1 } };
```

Примеры кода с инициализатором в виде '\{ 0 \}': 

```cpp
int num1[3][2]  = { 0 }; 
int num2[3][2] = { { 1, 2 }, { 0 }, { 5, 6 } };
int num3[2][2] = { { 0 }, [1][1] = 1 };
```