MISRA-C 规则5.4 为什么这两句违反了规定?
规则 5.4(强制): 标签(tag)名称必须是唯一的标识符。程序中标签的名字不可重用, 不管是做为另外的标签还是出于其他目的。 ISO 9899:1990
没有定义当一个聚合体的声明以不同形式的类型标识符(struct 或 union)使用同一个标签时
的行为。标签的所有使用或者用于结构类型标识符,或者用于联合类型标识符,例如:
struct stag { uint16_t a; uint16_t b; };
struct stag a1 = { 0, 0 }; /* Compliant – compatible with above */
union stag a2 = { 0, 0 }; /* Not compliant – not compatible with
previous declarations */
void foo (void)
{
struct stag { uint16_t a; }; /* Not compliant – tag stag redefined */
}
如果类型定义是在头文件中完成的,且头文件被多个源文件包含,那么规则不算违背。(这句什么意思)
那两句Not compliant究竟是跟第一句如何冲突,第一个compliant 又如何不冲突?求解。谢谢! 本帖最后由 toofree 于 2018-10-23 09:28 编辑
结构体定义了类型名称stag ,第一个不兼容union stag a2 = { 0, 0 }; ,却是用的共同体,所以冲突;
第二个冲突struct stag { uint16_t a; };,是在函数中重新定义一个结构体类型stag,而与之前的名字相同,而冲突。
第一句不冲突struct stag a1 = { 0, 0 };,相当于 stag a1 = { 0, 0 };,是结构体变量定义,而不是类型定义。 没人吗?:shutup: 你是做汽车控制器开发的吗? toofree 发表于 2018-10-23 09:26
结构体定义了类型名称stag ,第一个不兼容union stag a2 = { 0, 0 }; ,却是用的共同体,所以冲突;
第二个 ...
明白,谢谢你哈哈:loveliness: stm1024 发表于 2018-10-23 10:54
你是做汽车控制器开发的吗?
有涉及到
页:
[1]