Работа с typedef enumsми в структурах и предотrotation предупреждений о смешивании типов

Я работаю с C99. Мой компилятор – это IAR Embedded workbench, но я предполагаю, что этот вопрос будет применим и для некоторых других компиляторов.

У меня есть перечисление typedef с несколькими элементами в нем, и я добавил элемент к структуре этого нового типа

typedef enum { foo1, foo2 } foo_t; typedef struct { foo_t my_foo; ... } bar_t; 

Теперь я хочу создать экземпляр bar_t и инициализировать всю свою память до 0.

 bar_t bar = { 0u }; 

Это порождает предупреждение о том, что я смешиваю перечисление с другим типом. Специфическим предупреждающим номером IAR является Pe188. Он компилируется и работает отлично, поскольку перечисление представляет собой unsigned int в конце дня. Но я бы хотел избежать тысячи назойливых предупреждений. Каков чистый способ инициализации типов структур, которые перечисляли типы в них до 0?

ради аргумента позволяет предположить, что у bar_t есть много членов – я хочу просто установить их все на 0. Я бы предпочел не печатать что-то вроде этого:

 bar_t bar = { foo1, 0u, some_symbol,... , 0u}; 

EDIT: Дополнительное примечание: Я соблюдаю MISRA. Поэтому, если обходной путь будет нарушать MISRA, он просто переместит проблему для меня. Вместо этого меня попросит MISRA checker.

Если вы действительно, буквально хотите инициализировать всю память структуры до 0, то это пишется

 memset(&bar, 0, sizeof(bar_t)); 

Это на самом деле довольно распространено, и это даже имеет тенденцию работать, но технически это неправильно для того, что большинство людей действительно хочет. Не гарантируется правильность действий для большинства типов элементов, поскольку C дает меньше гарантий, чем многие люди думают о представлениях значений разных типов и о значении различных битовых шаблонов.

Правильный способ инициализации агрегированного объекта (например, структуры), как если бы присваивать значение нулю каждому элементу, – это то, с чего вы начали, хотя канонический способ его написать просто

 bar_t bar = { 0 }; 

(нет необходимости в суффиксе ‘u’). Существует отдаленная возможность того, что этот вариант избежит предупреждения компилятора, хотя я бы этого не ожидал.

Ашалинд дает ответ, который я считаю наиболее правильным (то есть,

 bar_t bar = { foo1 }; 

). Если это каким-то образом нарушает условные обозначения кода, с которыми вы должны соответствовать, возможно, вы могли бы реорганизовать свою struct так, чтобы первый элемент был любого типа, кроме типа enum .