C11允许相同定义的typedef重定义,为何结构体typedef重定义会报错?
问题核心原因
C11确实允许对typedef进行重定义,但前提是两次typedef声明指向的是完全相同的类型,你遇到的报错本质是两个匿名结构体不属于同一类型,和typedef规则本身无关。
- 你代码中两次typedef用到的都是没有标签的匿名结构体:C标准明确规定,每一次定义的匿名结构体都是独立的全新类型,哪怕成员布局、成员类型完全一致,也会被判定为不同类型。所以两次
a_t的定义指向不同类型,不符合C11重定义typedef的要求,编译器自然会报错。 - 基础类型不会有这个问题的原因很简单:
int是C语言内置的唯一确定类型,两次typedef int a_t;指向的都是同一个int类型,完全符合重定义的规则,所以不会触发报错。
解决方法
如果需要让结构体类型的typedef支持C11下的重定义,给结构体加上明确的标签即可:
// 给结构体加上a_tag标签,两次定义的struct a_tag会被识别为同一个类型 typedef struct a_tag { int x; } a_t; typedef struct a_tag { int x; } a_t;
如果是头文件引用场景的通用解决方案,更推荐直接加头文件保护宏,不管是老版本编译器还是匿名结构体场景都能规避重定义问题:
// 头文件开头 #ifndef YOUR_HEADER_H #define YOUR_HEADER_H // 所有头文件内容 typedef struct { int x; } a_t; // 头文件结尾 #endif
部分编译器也支持用#pragma once实现同样的头文件去重效果,写法更简单。
内容的提问来源于stack exchange,提问作者lipi
相关产品推荐
相关产品推荐

