初始化字符数组和MISRA错误



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

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

这一行生成以下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类型被我的编译器(IAR EW)实现为signed char

我的理解是''是一个字符字面量,因此,应该匹配类型char

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

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

char version_text[64U] = { 0 };

是完全等价的(这与char的签名无关)。它们都提供了一个int常量作为唯一的初始化项。

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

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

规则说:

"还要注意数组或结构体中的所有元素都可以初始化(为零或NULL)只有第一个元素。如果选择此初始化方法那么第一个元素应该初始化为零(或NULL),并且不需要使用嵌套大括号。"

根据这一点,只有{0}{NULL}符合MISRA,而{''}不符合MISRA(即使编译器以相同的方式对待它们)。

尝试如下:

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

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

相关内容

  • 没有找到相关文章