在结构中使用typedef枚举并避免类型混合警告

时间:2014-11-25 22:30:15

标签: c struct enums typedef iar

我正在使用C99。我的编译器是IAR Embedded工作台,但我认为这个问题也适用于其他一些编译器。

我有一个带有几个项目的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};
编辑:额外注意:我遵守MISRA。因此,如果一种解决方法违反MISRA,它只会为我解决问题。我会被MISRA检查员唠叨。

1 个答案:

答案 0 :(得分:1)

如果你真的,字面想要将结构的所有内存初始化为0,那么拼写

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

这实际上相当常见,它甚至可以起作用,但从技术上来说,这对于大多数人真正想要的东西是不正确的。对于大多数元素类型,不能保证做正确的事情,因为C比许多人对不同类型的值的表示以及各种位模式的含义的考虑做出更少的保证。

初始化聚合对象(如结构)的正确方法就像为每个元素赋值零一样,这就是你开始使用的方法,尽管编写它的规范方法就是

bar_t bar = { 0 };

(不需要'u'后缀)。这种变体很可能会避免编译器警告,但我真的不希望如此。

Ashalynd给出了我认为最正确的答案(即

bar_t bar = { foo1 };

)。如果这在某种程度上违反了您必须遵守的代码约定,那么您可以重新组织struct,以便第一个元素属于enum类型以外的任何类型。