bobo4869 发表于 2018-10-22 17:53:15

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:26:28

本帖最后由 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 };,是结构体变量定义,而不是类型定义。

bobo4869 发表于 2018-10-23 09:12:45

没人吗?:shutup:

stm1024 发表于 2018-10-23 10:54:24

你是做汽车控制器开发的吗?

bobo4869 发表于 2018-10-27 14:10:07

toofree 发表于 2018-10-23 09:26
结构体定义了类型名称stag ,第一个不兼容union stag a2 = { 0, 0 }; ,却是用的共同体,所以冲突;
第二个 ...

明白,谢谢你哈哈:loveliness:

bobo4869 发表于 2018-10-27 14:10:24

stm1024 发表于 2018-10-23 10:54
你是做汽车控制器开发的吗?

有涉及到
页: [1]
查看完整版本: MISRA-C 规则5.4 为什么这两句违反了规定?