You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:01:00