1

我有以下行(减少到最低限度的演示问题):

char version_text[64U] = {'\0'};

此行生成以下 MISRA 错误:

Error[Pm023]: missing elements - braces shall be used to indicate and match the structure in the non-zero initialization of arrays and structures (MISRA C 2004 rule 9.2).

为什么这是一个错误?

我目前的解决方法是:

char version_text[64U] = {0};

这表明该char类型是signed char由我的编译器(IAR EW)实现的。

我的理解是 '\0' 是一个字符文字,因此应该匹配 type char

4

3 回答 3

1

在 C 中,整数字符常量的类型是int,而不是char。所以

char version_text[64U] = { '\0' };

char version_text[64U] = { 0 };

是完全等价的(这与 的符号无关char)。两者都提供一个int常量作为唯一的初始化器。

MISRA 检查器抱怨第一个,而不是第二个,这只是不一致。

然而,这可能是因为零初始化通常是通过提供一个来完成的0,而使用整数字符常量通常只用于非零初始化 - 如果我解释消息,MISRA 期望所有元素的初始化器正确,并且检查器只是不查看字符常量内部。

于 2013-01-19T00:09:10.010 回答
1

规则说:

“还请注意,数组或结构的所有元素都可以通过仅为第一个元素提供显式初始化程序来初始化(为零或 NULL)。如果选择了这种初始化方法,则第一个元素应初始化为零(或 NULL ),并且不需要使用嵌套大括号。”

据此,只有{0}and{NULL}符合 MISRA,而 {'\0'} 不符合(即使编译器以相同的方式处理它们)。

于 2013-01-19T00:15:16.517 回答
0

尝试以下方法:

char version_text[64U] = { '\0', };

这实际上会将每个数组元素初始化为NULL不仅是第一个元素。注意逗号!

于 2013-02-14T11:02:16.703 回答