typedef在结构体声明/定义中位置差异及指针、列表影响探究
typedef在结构体声明中的两种写法对比及指针影响
两种写法的风格与优势
C语言中,typedef与结构体结合有两种合法写法,各自有不同的适用场景:
1. typedef 位于结构体块前(主流写法)
格式:typedef struct 标签 { ... } 类型名;
- 这是行业通用的主流写法,几乎所有教材、开源项目都采用,可读性和兼容性拉满,其他开发者一眼就能明白这是在给结构体起别名。
- 符合C语言声明的常规逻辑:先明确“要定义类型别名”(typedef),再给出具体的结构体结构,逻辑顺承更自然。
- 同时声明多个类型别名(比如指针、数组、函数指针)时,结构更清晰,比如
typedef struct typeE {} typeE, *typeEptr;,能直接看出typeE是结构体类型,typeEptr是它的指针类型。
2. typedef 位于结构体块后(小众写法)
格式:struct 标签 { ... } typedef 类型名;
- 语法上更贴近“先定义结构体,再给它加别名”的直观逻辑,习惯从右往左读声明的开发者可能觉得更顺。
- 如果结构体成员比较复杂,这种写法能让读者先聚焦结构体的内容,再关注别名是什么,优先级更清晰。
- 属于C标准允许的合法语法,clang等编译器都支持,但因为是小众写法,团队协作时可能需要额外沟通。
加入指针后的变化
不管用哪种写法,给typedef加上指针后,都会直接改变类型别名的本质:
- 比如
typedef struct typeAa {int i;} *typeAa;,此时typeAa代表的是结构体指针类型,而不是结构体本身。声明变量时typeAa var;就等价于struct typeAa *var;,不用再写*,简化了指针变量的声明。 - 但这种写法会隐藏“指针”的特性,不熟悉代码的人可能误以为
typeAa是普通值类型,容易在内存管理(比如忘记malloc)、赋值操作时出错。 - 两种写法加入指针后的最终效果完全一致,只是语法顺序不同,生成的类型别名都是同一个指针类型。
合法写法示例
// typedef 在结构体块前的写法 typedef struct typeA {int i;} typeA; typedef struct typeAa {int i;} * typeAa; typedef struct typeC {} typeC; typedef struct typeCc {} * typeCc; typedef struct typeE {} typeE, typeEptr[], * typeEArrayptr, typeEptrArrayfunc(); // typedef 在结构体块后的写法 struct typeB {int i;} typedef typeB; struct typeBb {int i;} typedef * typeBb; struct typeD {} typedef typeD; struct typeDd {} typedef * typeDd;
内容的提问来源于stack exchange,提问作者Carl Johnson
相关产品推荐
相关产品推荐

