學習資料, 專業群解答, 免費直播課程, ”C/C++ 8群 491994603
C語言常常讓人覺得它所能表達的東西非常有限。
它不具有類似第一級函數和模式匹配這樣的高級功能。
但是C非常簡單,
並且仍然有一些非常有用的語法技巧和功能,
只是沒有多少人知道罷了。
指定的初始化
很多人都知道像這樣來靜態地初始化陣列:
int fibs[] = {1, 1, 2, 3, 5};C99標準實際上支援一種更為直觀簡單的方式來初始化各種不同的集合類資料(如:結構體, 聯合體和陣列)。
陣列
我們可以指定陣列的元素來進行初始化。 這非常有用, 特別是當我們需要根據一組#define來保持某種映射關係的同步更新時。
學習資料, 專業群解答, 免費直播課程, ”C/C++ 8群 491994603
現在, 假設我們想為每個錯誤碼提供一個錯誤描述的字串。 為了確保陣列保持了最新的定義, 無論標頭檔做了任何修改或增補, 我們都可以用這個陣列指定的語法。
學習資料, 專業群解答, 免費直播課程, ”C/C++ 8群 491994603
這樣就可以靜態配置足夠的空間, 且保證最大的索引是合法的, 同時將特殊的索引初始化為指定的值, 並將剩下的索引初始化為0。
學習資料, 專業群解答, 免費直播課程, ”C/C++ 8群 491994603
宏清單
C中的一個慣用方法,
是說有一個已命名的實體清單,
需要為它們中的每一個建立函數,
將它們中的每一個初始化,
並在不同的代碼模組中擴展它們的名字。
這在 Mozilla的源碼中經常用到,
我就是在那時學到這個技巧的。
例如,
在我去年夏天工作的那個項目中,
我們有一個針對每個命令進行標記的巨集清單。
其工作方 式如下:
學習資料, 專業群解答, 免費直播課程, ”C/C++ 8群 491994603
它定義了一個FLAG_LIST巨集, 這個巨集有一個參數稱之為 _ ,
學習資料, 專業群解答, 免費直播課程, ”C/C++ 8群 491994603
對FLAG_LIST(DEFINE_FLAG)做擴展能夠得到如下代碼:
學習資料, 專業群解答,
接著, 對每個參數都擴展DEFINE_FLAG宏, 這樣我們就得到了enum如下:
學習資料, 專業群解答, 免費直播課程, ”C/C++ 8群 491994603
接著, 我們可能要定義一些訪問函數, 這樣才能更好的使用flag列表:
學習資料, 專業群解答, 免費直播課程, ”C/C++ 8群 491994603
一步步的展示其過程是非常有啟發性的, 如果對它的使用還有不解, 可以花一些時間在學習上。