0%

Designated initializer in C99

在C99之後,新增了一種初始化方法。可以方便的設定structure/arry的初始值。帶來了極大的靈活

在之前的時期,要初始化一個structure,只能用以下的方式。

lang: c
1
2
3
4
5
typedef struct MyData {
char *p;
int v;
} MyData;
MyData a = { "name" , 10};

這種方式稱作Aggregate Initialization
需要按照Type定義的方式來初始化,一旦我們修改MyData資料結構,所有用到MyData的初始化都需修改。
在C99之後,我們可以這樣做

lang: c
1
MyData a = { .v = 10, .p = "name"};

這樣就可以用任何順序指定初始值了。
另一個常用的應用場合是Array,拿以下這段程式碼當範例。

lang: c
1
2
3
4
5
6
7
8
9
10
enum {
YAHOO = 0,
GOOGLE,
FACEBOOK
};
char *old_style_weburl[] = {
"www.yahoo.com",
"www.google.com",
"www.facebook.com"
};

當我們將 FACEBOOK跟YAHOO的順序對換之後,old_style_weburl的對應關係也要跟著改變。

lang: c
1
2
3
4
5
char *new_style_weburl[] = {
[FACEBOOK] = "www.facebook.com",
[YAHOO] = "www.yahoo.com",
[GOOGLE] = "www.google.com"
};

這樣子不管enum裡的順序怎麼改變,new_style_weburl對應關係都能維持正確。
有興趣的可以參考Designated Initializers學到更多。