exponenta event banner

MISRA C++: 2008 Правило 8-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 Example ex1 {}; //Compliant

Внедрение Polyspace

Если инициализация массива, объединения или структуры, содержащей вложенные структуры, отличается от нуля и вложенные фигурные скобки не используются для отображения вложенной структуры, 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 несовместим, поскольку инициализирует только первый подмассив при явной инициализации всех элементов другого подмастерья.

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

Группа: Деклараторы
Категория: Обязательно
Представлен в R2013b