定義複合文字的初始化
複合文字是一個未命名的物件,它是在定義的範圍內建立的。該概念最初是在 C99 標準中引入的。複合文字的一個例子是
C 標準,C11-§6.5.2.5/ 9 中的示例:
int *p = (int [2]){ 2, 4 };
p
初始化為兩個 int 的未命名陣列的第一個元素的地址。
複合文字是左值。未命名物件的儲存持續時間是靜態的(如果文字出現在檔案範圍內)或自動(如果文字出現在塊範圍內),在後一種情況下,物件的生命週期在控制離開封閉塊時結束。
void `f(void)` { int *p; /*...*/ p = (int [2]){ *p }; /*...*/ }
p
被分配了兩個整數陣列的第一個元素的地址,第一個元素具有p
先前指向的值,第二個元素為零。[…]
這裡 p
一直有效,直到塊結束。
複合文字與指示符
(也來自 C11)
struct point {
unsigned x;
unsigned y;
};
extern void drawline(struct point, struct point);
// used somewhere like this
drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4});
虛擬函式 drawline
接收兩個型別為 struct point
的引數。第一個具有座標值 x == 1
和 y == 1
,而第二個具有 x == 3
和 y == 4
複合文字而不指定陣列長度
int *p = (int []){ 1, 2, 3};
在這種情況下,陣列的大小沒有指定,然後它將由初始化程式的長度決定。
複合文字,初始化程式的長度小於指定的陣列大小
int *p = (int [10]){1, 2, 3};
複合文字的其餘元素將被隱式初始化為 0
。
只讀複合文字
請注意,複合文字是左值,因此它的元素可以修改。甲只讀化合物字面可使用 const
限定符 (const int[]){1,2}
來指定。
包含任意表示式的複合文字
在函式內部,複合文字,與 C99 以來的任何初始化一樣,可以有任意表示式。
void foo()
{
int *p;
int i = 2; j = 5;
/*...*/
p = (int [2]){ i+j, i*j };
/*...*/
}