C语言结构体的第二种和第三种声明方式为何合法?
关于C语言结构体声明的两个常见疑问解答
嘿,这两个问题问得特别到位,都是初学C结构体时容易卡壳的点,我来给你讲明白:
疑问1:第二种写法里结构体大括号后为啥没分号?
先看你给出的第二种代码:
struct book { char name; float price; int pages; } b1, b2, b3;
其实这里不是“大括号后没分号”,而是分号的位置你没注意到——它在变量列表b1, b2, b3的末尾。
C语言里,结构体声明有两种常见形式:
- 单独定义结构体类型:
struct book { ... };这里大括号后必须加分号,因为这是一条完整的类型声明语句。 - 定义类型+声明变量合并写法:就是你说的第二种,它把“结构体类型定义”和“该类型的变量声明”合并成了一条语句。大括号后面的
b1, b2, b3是直接声明的该类型变量,最后用分号结束整个语句,完全符合C的语法规则。本质上和先定义类型再声明变量是等价的,只是写法更紧凑。
疑问2:第三种匿名结构体为啥合法?
第三种写法是:
struct { char name; float price; int pages; } b1, b2, b3;
这是C语言允许的匿名结构体(anonymous structure)。
这种写法合法的原因是:当你确定之后不需要复用这个结构体类型(也就是不会再用struct XXX来声明新的同类型变量),就可以省略结构体的标签(名称)。编译器在处理这条语句时,会直接为b1, b2, b3分配内存,不需要记住这个结构体的名称——毕竟你之后也不会用它来创建新变量了。
不过要注意匿名结构体的限制:它不能用来声明新的变量,也不能作为函数的参数或返回类型,因为没有类型名称可以引用它。
内容的提问来源于stack exchange,提问作者daya
相关产品推荐
相关产品推荐

