C语言typedef结构体命名规则及类型别名编译要求问题咨询
示例代码
#include <stdio.h> #include <string.h> // typedef作用是给结构体类型自定义别名,简化后续变量定义的写法 typedef struct Course { char courseName[60]; float CourseFee; char companyName[100]; int loginID; } Course; int main( ) { Course course; strcpy(course.courseName, "C Programming"); strcpy(course.companyName, "EDUCBA"); course.CourseFee = 5000.00; course.loginID=2452; printf( "Course Name : %s\n", course.courseName); printf( "Company Name : %s\n", course.companyName); printf( "Course Fee : %f\n", course.CourseFee); printf( "Login ID : %d\n", course.loginID); return 0; }
问题解答
1. 定义自定义类型时,是否必须为其设置别名才能正常编译?
不是必须的。
C语言中就算不用typedef给结构体设置别名,也可以正常编译使用,只需要在定义变量时带上struct前缀即可。比如你这段代码如果删掉第9行的Course(也就是去掉别名定义),只要把main函数里的变量定义改为struct Course course;,代码就能正常运行。typedef的作用只是给现有类型起一个更短的别名,减少重复代码,没有语法层面的强制要求。
2. 代码中用Course定义变量course的设计原因是什么,对应语法逻辑是怎样的?
- 语法逻辑:你这段代码里的
typedef struct Course {...} Course;可以拆成两步理解:第一步定义了一个标签为Course的结构体类型,第二步用typedef给struct Course这个完整类型起了别名Course,后续定义该类型变量时就不需要再写struct前缀,直接用Course即可。这里要注意Edubaca的表述有点歧义:course是该类型的变量实例,不是类型的别名,类型别名是前面定义的Course。 - 设计原因:因为C语言区分大小写,所以类型名用大写开头的
Course、变量名用小写的course不会出现命名冲突,同时语义更直观:Course代表课程这个通用类型,course代表一个具体的课程实例,代码可读性更高,这只是行业常用的命名习惯,没有语法强制要求。
3. 第4行struct关键字后的Course标签是否是必要的?
分使用场景判断:
- 如果你这个结构体不需要自引用(类似链表节点那种内部需要声明指向同类型结构体的指针),且后续只会用typedef的别名定义变量,那这个标签可以省略,直接写成
typedef struct { ... } Course;,代码完全可以正常运行。 - 如果你的结构体需要自引用,或者后续打算用
struct Course的格式定义变量,那这个标签就是必要的。因为typedef的别名要等整个结构体定义完成后才会生效,结构体内部声明自引用指针时别名还不可用,只能通过struct 标签名的格式声明指针类型。
你之前尝试把第4、9行的Course换成小写course的操作是可行的,C语言区分大小写,只要后续定义变量时和你设置的别名对应即可,语法上没有强制要求结构体标签或者别名的大小写格式。
内容的提问来源于stack exchange,提问作者Anique
相关产品推荐
相关产品推荐

