规则 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 又如何不冲突? 求解。谢谢! |
结构体定义了类型名称stag ,第一个不兼容union stag a2 = { 0, 0 }; ,却是用的共同体,所以冲突;
第二个冲突struct stag { uint16_t a; };,是在函数中重新定义一个结构体类型stag,而与之前的名字相同,而冲突。
第一句不冲突struct stag a1 = { 0, 0 };,相当于 stag a1 = { 0, 0 };,是结构体变量定义,而不是类型定义。
评分
查看全部评分
明白,谢谢你哈哈
有涉及到