首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言結構體指定初始化器:現代寫法詳解

     編輯:關於C

閱讀 Asterisk 源碼時發現一種優雅的結構體初始化寫法——指定初始化器。這是 C99 標準引入的特性,能顯著提升代碼可讀性與維護性。

傳統 vs 現代寫法對比

傳統逐字段賦值

ST t2;
t2.a = 4;
t2.b = 5;
t2.fun = test2;

C99 指定初始化器

ST t1 = {
    .a = 1,
    .b = 2,
    .fun = test1
};

完整示例代碼

#include <stdio.h>

typedef void (*pFun)(int a);

typedef struct ST {
    int a;
    int b;
    pFun fun;
} ST;

void test1(int a) { printf("test1 : %d\r\n", a); }
void test2(int a) { printf("test2 : %d\r\n", a); }

int main() {
    // 指定初始化器寫法
    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;
}

編譯與運行

$ gcc test20120608.c -o test20120608 -std=c99
$ ./test20120608
1       2
test1 : 3
4       5
test2 : 6

運行結果

指定初始化器的優勢

特性說明
字段順序無關可按任意順序初始化,如 {.b=2, .a=1}
部分初始化未指定字段自動零初始化,避免垃圾值
可讀性強字段名與值對應一目了然,減少誤賦值
嵌套結構友好支援巢狀結構體的深層指定初始化
數組也適用如 int arr[10] = {[5] = 100, [9] = 200};

進階用法示例

// 嵌套結構體
typedef struct { int x, y; } Point;
typedef struct { Point center; int radius; } Circle;

Circle c = {
    .center = { .x = 10, .y = 20 },
    .radius = 5
};

// 數組指定初始化
int scores[5] = { [2] = 95, [4] = 100 }; // scores = {0, 0, 95, 0, 100}

注意事項

  • 需編譯器支援 C99 或更新標準(GCC 加 -std=c99,MSVC 部分版本需 /std:c11 或更高)
  • C++ 標準直到 C++20 才正式引入指定初始化器,且語法略有差異
  • 混合使用指定與非指定初始化時,非指定部分按順序填充,易產生困惑,建議統一風格

總結

指定初始化器是現代 C 語言提升代碼質量的利器。在嵌入式、系統編程中大量使用結構體配置時,善用此特性能讓初始化邏輯清晰、抗重構能力強。推薦在所有新項目中採用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved