你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

MISRA-C 规则5.4 为什么这两句违反了规定?

[复制链接]
bobo4869 提问时间:2018-10-22 17:53 /
规则 5.4(强制): 标签(tag)名称必须是唯一的标识符。
程序中标签的名字不可重用, 不管是做为另外的标签还是出于其他目的。 ISO 9899:1990 [2]
没有定义当一个聚合体的声明以不同形式的类型标识符(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 又如何不冲突?  求解。谢谢!
收藏 评论5 发布时间:2018-10-22 17:53

举报

5个回答
七哥 回答时间: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 };,是结构体变量定义,而不是类型定义。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

bobo4869 回答时间:2018-10-23 09:12:45
没人吗?
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 }; ,却是用的共同体,所以冲突;
第二个 ...

明白,谢谢你哈哈
bobo4869 回答时间:2018-10-27 14:10:24
stm1024 发表于 2018-10-23 10:54
你是做汽车控制器开发的吗?

有涉及到

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版