gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:40:40 26 4
gpt4 key购买 nike

我正在使用 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 检查器唠叨。

最佳答案

如果你真的,从字面上想要将一个结构的所有内存初始化为 0,那么这就是拼写

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

这实际上相当普遍,甚至往往会奏效,但从技术上讲,它不符合大多数人的实际需要。它不能保证对大多数元素类型做正确的事情,因为 C 对不同类型的值的表示以及各种位模式的含义所做的保证比许多人想象的要少。

初始化聚合对象(例如结构)的正确方法就像将值零分配给每个元素一样,这就是您开始的方式,尽管编写它的规范方法很简单

bar_t bar = { 0 };

(不需要“u”后缀)。该变体极有可能避免编译器警告,但我真的不希望如此。

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

bar_t bar = { foo1 };

)。如果这以某种方式违反了您必须遵守的代码约定,那么也许您可以重新组织您的 struct因此第一个元素是除 enum 之外的任何类型类型。

关于c - 在结构中使用 typedef 枚举并避免类型混合警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27137998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com