C99增加的特性,復合字面量(composite literal)。一旦熟悉並使用,便會體會到簡潔強大的表達。
所謂字面量就是固定數值的表示。數值和字符串類型都有字面量的表達。如:
// 100, 1.23f, literral 都是字面量 int x = 100; float y = 1.23f; char* s = literral;
那麼復合字面量是幾個意思的復合?
composite 除了有復合的意思,也有組合的概念。既然組合,必然數組是直觀的對應。
所以,復合字面量就是數組字面量的意思。
曾經,我們是如何定義數組的。
int arr1[] = {0, 1, 2, 3}; int arr2[10] = {0};
int x; // 正確 x = 100; int arr[1]; // 錯誤 arr = {0};
對, 復合字面量,就是可以隨時定義,隨時賦值的數組字面量。兩步構建出來。
1. 形如 (type[]) 表示需要構建的數組類型,如: (int[]), (int*p), 還能是自定義的類型 (MyType[])
2. 跟著 { } 表示數組內容
int* intArr1 = (int[]) {0, 1, 2}; int* intArr2 = (int[100]) {0}; intArr1 = (int[]) {3, 4, 5}; intArr2 = (int[1]) {1}; typedef struct { void* data; int length; } Array; Array* arr1 = (Array[]) {NULL, 0}; Array* arr2 = (Array[1]) {(int[]) {1}, 1};
能夠隨時定義出一個,數組的字面量指針,能夠讓參數傳遞,初始化結構,更加的簡潔。
舉個例子:
typedef struct { void* data; int length; } Array; void foo(Array* arr) { } // 曾經的寫法 int data[] = { 1 }; Array arr [1] = {data, 1}; foo(arr); // 現在的寫法 foo((Array[]) { (int[]) { 1 }, 1 });
static Array* arr = (Array[]) { (int[10]) {0}, 1 };這個例子說明了,初始化一個結構時候的用法。任何一個復雜的自定義類型,我們都能夠通過復合文字定義出初始化的字面數值。
這在構建一些需要初始化的固定數據結構很有用處。
還有, 復合文字可以做左值。無論字面數值創建在棧上還是在堆上,都可以被賦值。
這就厲害了,可以發揮想象,有更多的黑魔法有待發掘。