GCC编译报错:typedef struct声明改变标识符含义的解决方案咨询
问题原因
你遇到的报错源于C语言的标识符名字空间规则:typedef定义的类型别名(此处的mystruct)与结构体成员名共享同一名字空间。当在struct2中写mystruct mystruct;时,编译器会将第一个mystruct误判为成员名的重复声明,而非类型,进而触发冲突错误。另外,::是C++的作用域运算符,C语言并不支持,因此用它修改代码会报语法错误。
解决办法
由于不能修改原头文件,以下两种基于GCC扩展的方法可解决问题:
方法一:重新定义类型别名
在包含原头文件后,用typeof获取原类型并创建新别名,规避与成员名的冲突:
#include "header.h" // 为原mystruct类型创建新别名 typedef typeof(mystruct) mystruct_type; typedef struct { // 使用新别名声明成员 mystruct_type mystruct; } struct2;
方法二:直接用typeof声明成员
在结构体内部通过typeof直接指定成员类型,跳过类型别名的冲突:
#include "header.h" typedef struct { // 直接用typeof获取原类型 typeof(mystruct) mystruct; } struct2;
补充说明
typeof是GCC的扩展特性,若需兼容标准C,理论上可给原头文件中的匿名结构体添加标签,但你明确不能修改原头文件,因此该方法不适用。上述两种方案均无需改动原头文件,完全符合你的需求。
内容的提问来源于stack exchange,提问作者chandrashekhar ghale
相关产品推荐
相关产品推荐

