前段時間,準備設計乙個關於出錯資訊的表,每乙個錯誤有乙個唯一的errid,和對應的錯誤資訊以及其他輔助資訊。在c語言中,很自然的實現如下:
enum
errid;
const
char
*errmsg =;
intmain()
這樣帶來的問題是很不容易維護,必須人為的確定每乙個errid和它的errmsg相對應。希望能不增加任何時間或空間的開銷的情況下,讓實現更加的「美觀」,更容易維護。自己第一時間能想到的,就是巨集或者模板。
#define
err_msg(id, msg) const char* err_msg_##id = msg;
#define
get_msg(id) (err_msg_##id)
err_msg(err_id_1,
"this is error 1 msg")
err_msg(err_id_2,
"this is error 2 msg")
err_msg(err_id_3,
"this is error 3 msg")
err_msg(err_id_4,
"this is error 4 msg")
intmain()
這個方法的好處在於連errmsg陣列的空間都省略掉了。缺點就是
不能支援在執行時通過傳入的errid來動態決定輸出。
不支援基於errmsg的遍歷操作甚至不知道errid的個數。因為errmsg本來就不存在。
首先,另外建乙個檔案,比如err.txt,每行的格式如:
err_msg(err_id_1, "this is error 1 msg")
err_msg(err_id_2, "this is error 2 msg")
err_msg(err_id_3, "this is error 3 msg")
err_msg(err_id_4, "this is error 4 msg")
在主檔案中:
#undef
err_msg
#define
err_msg(id, msg) id,
enum
errid;
#undef
err_msg
#define
err_msg(id, msg) msg,
const
char
*errmsg =;
在最後加入乙個無用的元素,用來避免某些編譯器監測到最尾元素後有逗號時的警告。
當然,errmsg陣列也不一定需要。比如,可以這樣實現乙個通過傳入的errid返回相應errmsg的函式get_err_msg():
#undef
err_msg
#define
err_msg(id, msg) case id: return msg; break;
const
char
*get_err_msg(errid eid)
return
null;
//dummy。用來消除某些編譯器的警告。}
C語言的宣告
c語言中變數的宣告一般特指以extern修飾的變數,表明該變數在其他檔案中定義。這裡宣告是更一般的概念,包括變數的定義 宣告和函式的原型等。宣告的通用格式如下 儲存型別 型別限定符 型別說明符 宣告符 宣告符包括以下四種 宣告符號也可能是上述四種的混合,對於複雜的宣告符 例如int x 10 voi...
C語言 關鍵字 static(宣告靜態變數)
static在c語言裡面有兩個作用,第乙個是修飾變數,第二個是修飾函式。按照作用範圍的不同,變數分為區域性變數和全域性變數。如果用static修飾變數,不論這個變數是全域性的還是區域性的都是儲存在全域性 靜態資料區。具體程式如下 include void example void int main ...
C語言宣告
怎樣定義和宣告全域性變數和函式最好。首先,儘管乙個全域性變數或函式可以有多處宣告但是定義卻最多隻允許出現一次,對於全域性變數,定義是真正分配空間並賦初值的宣告,對於函式,定義是提供函式體的宣告。例如 這些是宣告 extern int i extern int f 而這些是定義 int i 1 int...