【发布时间】:2015-01-24 02:56:38
【问题描述】:
我正在使用 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。它编译和工作得很好,因为枚举在一天结束时是一个无符号整数。但我想避免一千个烦人的警告。将其中包含枚举类型的结构类型初始化为 0 的干净方法是什么?
为了争论,我们假设 bar_t 有很多成员 - 我只想将它们全部设置为 0。我不想输入这样的内容:
bar_t bar = { foo1, 0u, some_symbol,... , 0u};
编辑:额外说明:我遵守 MISRA。因此,如果解决方法将违反 MISRA,它只会为我解决问题。我会被 MISRA 检查器唠叨。
【问题讨论】:
-
提供一个具有“默认”值的枚举?
-
好吧,在这种情况下,“默认”值将是 foo1,因为除非我另有说明,否则它将为 0。但即使我说 foo1 = 0,在枚举中我仍然会看到此警告。
-
您必须执行
bar_t bar = { foo1 };在这种情况下您仍然看到警告吗? (假设您将 foo1 定义为 0) -
我要编辑我的 OP - 我还必须遵守 MISRA 规则。这样做可以消除编译器警告,但我的 linting 工具会违反非零初始化。
-
“枚举是一天结束时的无符号整数” -
enum是普通的int,而不是unsigned int。
标签: c struct enums typedef iar