閱讀 Asterisk 源碼時,發現一種極其優雅的結構體初始化寫法:
typedef void (*pFun)(int a);
typedef struct ST {
int a;
int b;
pFun fun;
} ST;
// 傳統寫法
ST t2;
t2.a = 4;
t2.b = 5;
t2.fun = test2;
// C99 指定初始化器(設計初始化器)
ST t1 = {
.a = 1,
.b = 2,
.fun = test1
};
#include
typedef void (*pFun)(int a);
typedef struct ST {
int a;
int b;
pFun fun;
} ST;
void test1(int a) { printf("test1: %d\n", a); }
void test2(int a) { printf("test2: %d\n", a); }
int main() {
// C99 指定初始化器
ST t1 = {
.a = 1,
.b = 2,
.fun = test1
};
printf("%d\t%d\n", t1.a, t1.b);
t1.fun(3);
// 傳統逐項賦值
ST t2;
t2.a = 4;
t2.b = 5;
t2.fun = test2;
printf("%d\t%d\n", t2.a, t2.b);
t2.fun(6);
return 0;
}

| 特性 | 傳統寫法 | 指定初始化器 |
|---|---|---|
| 可讀性 | 分散多行 | 集中聲明,字段名自文檔化 |
| 順序依賴 | 無 | 無(可任意順序) |
| 部分初始化 | 需先零初始化 | 未指定字段自動零初始化 |
| 嵌套結構 | 繁瑣 | {.inner = {.x = 1}} 極簡 |
| 陣列初始化 | 僅順序 | [5] = 10, [2] = 3 隨機訪問 |
-std=c99 或 -std=gnu99(預設支援)最佳實踐:現代 C 專案(C99+)強烈推薦使用指定初始化器,代碼更安全、可讀、可維護。