定義複合文字的初始化

複合文字是一個未命名的物件,它是在定義的範圍內建立的。該概念最初是在 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 == 1y == 1,而第二個具有 x == 3y == 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 };
    /*...*/
}