复合字面量
2026/8/24大约 1 分钟
C99 复合字面量
复合字面量(Compound Literal)是 C99 引入的特性:
不定义变量名,直接创建一个对象并立即使用。
基本语法:
(类型){初始化列表}一、结构体
普通写法:
struct Point
{
int x;
int y;
};
struct Point p = {10, 20};
draw(p);使用复合字面量:
draw((struct Point){10, 20});也可以指定成员:
draw((struct Point){
.x = 10,
.y = 20
});其中:
(struct Point){10, 20}就是一个没有变量名的 struct Point 对象。
二、数组
普通写法:
int arr[] = {1, 2, 3, 4};
foo(arr);复合字面量:
foo((int[]){1, 2, 3, 4});这里:
(int[]){1, 2, 3, 4}就是现场创建的数组。
三、嵌入式中的典型用法
配置结构体只使用一次时:
set_config((Config){
.baudrate = 115200,
.parity = 0,
.stop_bits = 1
});不需要再写:
Config cfg;
cfg.baudrate = 115200;
cfg.parity = 0;
cfg.stop_bits = 1;
set_config(cfg);代码更直接。
四、生命周期
函数内部使用的复合字面量:
void test(void)
{
Config *p = &(Config){.baudrate = 115200};
}对象具有当前代码块的生命周期,不能在离开作用域后继续使用。
文件作用域的复合字面量具有静态存储期。
五、最终记忆
(struct Point){10, 20}
↓
现场创建一个匿名 Point 对象
(int[]){1, 2, 3}
↓
现场创建一个匿名数组复合字面量 =
(类型){初始化值},不定义变量名,直接创建对象并使用。

