Как я могу заставить GCC утверждать ошибку времени компиляции, когда массив постоянных структур имеет один неинициализированный элемент?
Я хочу генерировать утверждения во время компиляции, проверяя, инициализирован ли каждый элемент в структуре или нет. Мне было интересно, как я могу сгенерировать цикл for таких статических утверждений во время компиляции, учитывая, что утверждение не является командой препроцессора.
Проблема заключалась в том, что неинициализированные элементы в такой структуре констант приводили к неопределенному поведению в системе.
Попытка изменить флаги компилятора GCC -Wuninitialized или -Wmaybe-uninitialized не определяет, когда элемент в массиве структур не заполнен.
Следил за следующей нитью Static assert в C
_Static_assert(fl_Button_List_SA[0].Button_constants_S.Button_Pressed_output != unintializedVariable.Button_constants_S.Button_Pressed_output ,"Struct is uninitialized.");
fl_Button_List_SA — это массив структур.Button_constants_S — это структура, содержащая только константы. Button_pressed_output — это элемент, определенный как константа, содержащая вывод при нажатии кнопки.
uninitializedVariable — это структура того же типа, которая осталась неинициализированной.
Приведенное выше утверждение в настоящее время возвращает следующую ошибку: «ошибка: выражение в статическом утверждении не является константой», но мне удастся обойти это. Однако для получения дополнительной информации структура кнопки внутри массива состоит из структуры, содержащей две структуры, одна из которых содержит только константы, а другая содержит только переменные. И учитывая, что сами структуры не являются константами, должно быть, поэтому возникает эта проблема.
Я просто хотел бы сгенерировать код, который проходит через все элементы каждой структуры внутри массива и проверяет, что элементы инициализированы.
В качестве примера инициализации:
//struct definition
typedef struct Button_properties_t
{
Button_constants Button_constants_S;
Button_variables Button_variables_S;
} Button_properties;
Button_properties Button_list[numberOfButtons] =
{
[0].Button_constants_S.pressed_output=2u,
[0].Button_constants_S.DTC_number=First_Button, //Enum
...
...
}
То, что я ожидаю, - это ошибка времени компиляции, похожая на ржавчину: если, например, во время инициализации кнопки с номером [100] программист не может определить номер DTC для этой кнопки, возникает ошибка времени компиляции.
[100].Button_constants_S.pressed_output = 4u,
//[100].Button_constants_S.DTC_number uninitialized
...
...
[101].Button_constants_S.pressed_output = 5u,
[101].Button_constants_S.DTC_number = Fifth_Button, //Enum
...