1. 標準 C89 要求集合或陣列元素的初始值必須依照宣告時的元素順序指定。

2. 標準 C99 放寬這個限制,藉由指定陣列索引或集合元素名稱的方式,讓你能以任何順序提供初始值。

3. GNU C 允許你在 C89 模式下使用這個功能,但 GNU C++ 並不允許使用這個功能。

4. 要指定陣列索引,你必須在元素值前面寫 [index]=,沒有加上索引的值會被指派給緊鄰的下一個元素。像是這樣:
int a[7] = { [4]=29, 33, [2]=15 };
相當於
int a[7] = { 0, 0, 15, 0, 29, 33, 0 };
另外,即使初始化的陣列是自動變數,索引值也必須是常數。
一個可替代這的語法是在元素值前面寫上“.[index]”,沒有“=”,但從 GCC 2.5 開始就不再被使用,但 GCC 仍然接受。

5. 要將一連串元素以相同值初始化,你能使用 [first ... last]=value,這是 GNU 的延伸功能。
int a[]= { [0 ... 9]=1, [10 ... 99]=2, [100] =3};
如果 value 需要進行運算,則它只會計算一次,而不會為每個元素重新計算。

6. 在進行結構初始化動作時,你能以 .member= 指定你要初始化的欄位名稱。比如
struct triplet {
int x, y, z;
};
struct triplet p = {
.y = 100,
.x = 200,
.z = 300
}
相當於
struct triplet p = {
200,
100,
300
}

7. 在進行結構初始化動作時,也可以 fieldname: 來指定初始化欄位名稱,不過這個用法從 GCC 2.5 開始廢除。比如
struct input_handler {
void *private;
void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
struct input_handle* (*connect)(struct input_handler *handler, struct input_dev *dev);
void (*disconnect)(struct input_handle *handle);
struct file_operations *fops;
int minor;
struct input_handle *handle;
struct input_handler *next;
};
struct input_handler keybdev_handler = {
event: keybdev_event,
connect: keybdev_connect,
disconnect: keybdev_disconnect,
};


創作者介紹

邱小新の工作筆記

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()