指定初始化器
2026/8/24大约 2 分钟
C99 指定初始化器
指定初始化器(Designated Initializers)就是:
初始化时直接指定“我要初始化哪个成员”。
它是 C99 的特性,嵌入式 C 代码里非常常见。
一、结构体指定初始化
普通写法:
struct Device
{
int id;
int baud;
int timeout;
};
struct Device dev = {1, 115200, 1000};缺点是:
必须记住成员顺序。
C99 可以直接指定:
struct Device dev = {
.id = 1,
.baud = 115200,
.timeout = 1000
};这样一眼就知道每个值对应什么。
二、可以跳过成员
struct S
{
int a;
int b;
int c;
};
struct S s = {
.a = 1,
.c = 3
};没有初始化的成员:
a = 1
b = 0
c = 3所以:
.a = 1
.c = 3等价于:
struct S s = {1, 0, 3};三、数组也可以指定下标
int arr[5] = {
[2] = 10,
[4] = 20
};结果:
arr[0] = 0
arr[1] = 0
arr[2] = 10
arr[3] = 0
arr[4] = 20C99 的指定初始化器不仅能指定结构体成员,还能直接指定数组下标。
四、为什么嵌入式特别常见?
例如设备配置:
UartDevice uart1 = {
.port = 1,
.base = {
.ops = {
.open = uart_open,
.read = uart_read,
.close = uart_close
},
.self = &uart1
}
};比:
UartDevice uart1 = {
{{uart_open, uart_read, uart_close}, &uart1},
1
};更容易看懂,也不容易因为成员顺序变化而写错。
五、C99 和 C++20
C99:
struct S s = {
.a = 1,
.c = 3
};支持:
- 指定成员
- 跳过成员
- 数组指定下标
- 指定成员顺序不必和声明顺序一致
C++20:
S s = {
.a = 1,
.b = 2,
.c = 3
};限制更多:
指定成员必须按照声明顺序初始化。
而且 C++20 不支持 C99 那种:
int arr[5] = { [2] = 10 }; // ❌六、最终记忆
C99
↓
.a = value
[2] = value
↓
按名字/下标指定初始化核心优势:
不用死记成员顺序,代码更直观,尤其适合结构体配置、驱动初始化和寄存器描述。

