AUTOSAR C++14 Rule M8-5-2

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

Описание

Определение правила

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

Объяснение

Использование вложенных скобок в списках инициализаторов для соответствия структурам вложенных объектов в массивах, объединениях и структурах побуждает вас учитывать порядок инициализации типов комплексных данных и делает ваш код более читаемым. Для примера использование вложенных скобок в инициализации ex1 облегчает просмотр вложенных массивов arr1 и arr2 в структурном 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 внутренние структурные 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 не совместим, потому что нуль -initializes только первая подрешетка с явной инициализацией всех элементов другой подрешетки.

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

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