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

C99 指定初始化器:結構體賦值的現代寫法

     編輯:關於C語言

發現

閱讀 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 隨機訪問

編譯器支援

  • GCC:-std=c99 或 -std=gnu99(預設支援)
  • Clang:完整支援
  • MSVC:VS2013 起部分支援,VS2019 完整支援 C99 指定初始化器

最佳實踐:現代 C 專案(C99+)強烈推薦使用指定初始化器,代碼更安全、可讀、可維護。

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