C 初始化字符数组和MISRA错误
我有以下几行(简化为最低限度地说明问题): 该行生成以下MISRA错误:C 初始化字符数组和MISRA错误,c,arrays,array-initialization,misra,C,Arrays,Array Initialization,Misra,我有以下几行(简化为最低限度地说明问题): 该行生成以下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[64
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};
这表明我的编译器(IAR EW)将char
类型实现为signed char
我的理解是“\0”是一个字符文本,因此,应该与C中的类型
char
匹配,整数字符常量的类型是int
,而不是char
。所以
char version_text[64U] = { '\0' };
及
是完全等价的(这与char
的符号性无关)。两者都提供一个int
常量作为唯一的初始化器
MISRA检查者抱怨第一个,而不是第二个,这只是一种不一致
然而,这可能是因为零初始化通常只提供一个0
,而使用整数字符常量通常只用于非零初始化-如果我正确解释消息,MISRA希望所有元素都使用初始化器,而检查器只是不查看字符常量内部。规则说:
“还要注意,数组或结构的所有元素都可以
通过提供显式初始化器初始化(零或空)
仅第一个元素。如果选择此初始化方法
然后,第一个元素应初始化为零(或NULL),并且
无需使用嵌套大括号。”
根据这一点,只有
{0}
和{NULL}
符合MISRA,而{'\0'}不符合MISRA(即使编译器以相同的方式处理它们)。尝试以下操作:
char version_text[64U] = { '\0', };
这实际上会将每个数组元素初始化为NULL
,而不仅仅是第一个数组元素。
注意一个逗号 或者在本例中为“”
,这也是符合要求的。
char version_text[64U] = { 0 };
char version_text[64U] = { '\0', };