AUTOSAR C++14 Rule M8-5-2

Фигурные скобки должны использоваться, чтобы указать и совпадать со структурой в ненулевой инициализации массивов и структурами

Описание

Управляйте определением

Фигурные скобки должны использоваться, чтобы указать и совпадать со структурой в ненулевой инициализации массивов и структурами.

Объяснение

Использование вложенных фигурных скобок в списках инициализаторов, чтобы совпадать со структурами вложенных объектов в массивах, объединениях и структурах поощряет вас рассматривать порядок инициализации сложных типов данных и делает ваш код более читаемым. Например, использование вложенных фигурных скобок в инициализации ex1 облегчает, чтобы видеть, как вложенные массивы arr1 и arr2 в struct ex1 инициализируются.

struct Example
{
    int num;
    int arr1[2];
    int arr2[3];
};

//....
struct Example ex1 {1, {2, 3}, {4, 5, 6}}; //Compliant

Правило не требует использования вложенных фигурных скобок, если вы обнуляете, инициализируют массив, объединение, или struct с вложенными структурами является верхним уровнем, например:

struct Example ex1 {}; //Compliant

Реализация Polyspace

Если вы ненулевой инициализируете массив, объединение или struct, который содержит вложенные структуры и вы не используете вложенные фигурные скобки, чтобы отразить вложенную структуру, Polyspace® отмечает первый элемент первой вложенной структуры в списке инициализаторов. Например, в этом фрагменте кода, Polyspace отмечает номер 2 потому что это соответствует первому элементу вложенной структуры arr1 в struct ex1.

struct Example
{
    int num;
    int arr1[2];
    int arr2[3];
};

//....
struct Example ex1 {1, 2, 3, 4, 5, 6}; // Non-compliant

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

char arr1[2][3] {'a', 'b', 'c', 'd', 'e', 'f'}; //Non-compliant
char arr2[2][3] {{'a', 'b', 'c'}, {'d', 'e', 'f'}}; //Compliant
char arr_top_level[2][3] { }; //Compliant
char arr_sub_level[2][3] { {}, {'d', 'e', 'f'}}; //Non-compliant

В этом примере, двумерный массив arr1 несовместимо, потому что список инициализаторов не отражает вложенную структуру этого массива (два массива трех элементов каждый). Инициализация arr2 использование вложило фигурные скобки, чтобы отразить вложенную структуру массива и совместимо. Точно так же инициализация arr_top_level совместимо, потому что это обнуляет, инициализирует массив в верхнем уровне. Обратите внимание на то, что инициализация arr_sub_level несовместимо, потому что нуль - инициализирует только первую подрешетку, явным образом инициализируя все элементы другой подрешетки.

Проверяйте информацию

Группа: операторы объявления
Категория: необходимый, автоматизированный
Введенный в R2019a