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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:29:12