很多人都知道如何這樣靜態初始化數組:IntFibs [1 = {1,1,2,3,5},C99標準其實支持更直觀簡單的方式來初始化各種集合數據(比如結構,關聯,數組)。
第二,陣列
我們可以為初始化指定數組的元素。這是非常有用的,特別是當我們需要根據壹組#define保持壹些映射關系同步更新的時候。現在,假設我們想為每個錯誤代碼提供壹個錯誤描述字符串。為了確保數組保持最新的定義,無論頭文件做了什麽更改或添加,我們都可以使用該數組指定的語法。
這樣就可以靜態分配足夠的空間,保證最大的索引合法。同時,特殊索引被初始化為指定值,其余索引被初始化為0。
第三,結構和財團
用結構和關聯的字段名初始化數據非常有用。假設我們定義:struct point { int x;int y;int z;}然後,我們如下初始化struct point:truct point p {。x 3,.y 4,。z5];當我們不想將所有字段初始化為0時,該方法可以在編譯時輕松生成結構,而無需調用初始化函數。對於聯合體,我們可以使用相同的方法,只是我們只需要初始化壹個字段。
第四,宏列表
C中常用的方法是有壹個命名實體列表,需要為它們每壹個建立壹個函數,對它們每壹個進行初始化,在不同的代碼模塊中展開它們的名字。這是墨子訓練la的源碼中經常用到的,我就是在那時學會這個技能的。
例如,在我去年夏天參與的項目中,我們為每個命令標記了壹個宏列表。它定義了壹個FLAG_LIST宏,這個宏有壹個參數叫this parameter本身,這個宏可以調用列表中的每壹個參數。
動詞 (verb的縮寫)編譯時的斷言
這其實是C語言中利用宏實現的壹個很有創意的功能。有時,特別是在內核編程中,在編譯時而不是運行時進行條件檢查斷言非常有用。不幸的是,C99標準不支持任何編譯時斷言。
但是,我們可以使用預處理來生成代碼,這些代碼只有在滿足某些條件時才會被編譯(最好是不做實際功能的命令)。有多種方法可以做到這壹點,通常是通過創建壹個大小為負的數組或結構。