10、h和c文件的使用
H 文件和C文件怎么用呢?一般來說,H文件中是declare(聲明),C文件中是define(定義)。因?yàn)镃文件要編譯成庫文件(Windows下是. obj/.lib,UNIX下是.o/.a),如果別人要使用你的函數(shù),那么就要引用你的H文件,所以,H文件中一般是變量、宏定義、枚舉、結(jié)構(gòu)和函數(shù)接口的聲明,就像一個(gè)接口說明文件一樣。而C文件則是實(shí)現(xiàn)細(xì)節(jié)。
H文件和C文件最大的用處就是聲明和實(shí)現(xiàn)分開。這個(gè)特性應(yīng)該是公認(rèn)的了,但我仍然看到有些人喜歡把函數(shù)寫在H文件中,這種習(xí)慣很不好。(如果是C++話,對(duì)于其模板函數(shù),在VC中只有把實(shí)現(xiàn)和聲明都寫在一個(gè)文件中,因?yàn)?VC不支持export關(guān)鍵字)。而且,如果在H文件中寫上函數(shù)的實(shí)現(xiàn),你還得在makefile中把頭文件的依賴關(guān)系也加上去,這個(gè)就會(huì)讓你的 makefile很不規(guī)范。
最后,有一個(gè)最需要注意的地方就是:帶初始化的全局變量不要放在H文件中!
例如有一個(gè)處理錯(cuò)誤信息的結(jié)構(gòu):
char* errmsg[] = {
/* 0 */ "No error",
/* 1 */ "Open file error",
/* 2 */ "Failed in sending/receiving a message",
/* 3 */ "Bad arguments",
/* 4 */ "Memeroy is not enough",
/* 5 */ "Service is down; try later",
/* 6 */ "Unknow information",
/* 7 */ "A socket operation has failed",
/* 8 */ "Permission denied",
/* 9 */ "Bad configuration file format",
/* 10 */ "Communication time out",
......
......
};
請(qǐng)不要把這個(gè)東西放在頭文件中,因?yàn)槿绻愕倪@個(gè)頭文件被5個(gè)函數(shù)庫(.lib或是.a)所用到,于是他就被鏈接在這5個(gè).lib或.a中,而如果你的一個(gè)程序用到了這5個(gè)函數(shù)庫中的函數(shù),并且這些函數(shù)都用到了這個(gè)出錯(cuò)信息數(shù)組。那么這份信息將有5個(gè)副本存在于你的執(zhí)行文件中。如果你的這個(gè)errmsg很大的話,而且你用到的函數(shù)庫更多的話,你的執(zhí)行文件也會(huì)變得很大。
正確的寫法應(yīng)該把它寫到C文件中,然后在各個(gè)需要用到errmsg的C文件頭上加上 extern char* errmsg[]; 的外部聲明,讓編譯器在鏈接時(shí)才去管他,這樣一來,就只會(huì)有一個(gè)errmsg存在于執(zhí)行文件中,而且,這樣做很利于封裝。
我曾遇到過的最瘋狂的事,就是在我的目標(biāo)文件中,這個(gè)errmsg一共有112個(gè)副本,執(zhí)行文件有8M左右。當(dāng)我把errmsg放到C文件中,并為一千多個(gè) C文件加上了extern的聲明后,所有的函數(shù)庫文件尺寸都下降了20%左右,而我的執(zhí)行文件只有5M了。一下子少了3M啊。
[ 備注 ]
有朋友對(duì)我說,這個(gè)只是一個(gè)特例,因?yàn),如果errmsg在執(zhí)行文件中存在多個(gè)副本時(shí),可以加快程序運(yùn)行速度,理由是errmsg的多個(gè)復(fù)本會(huì)讓系統(tǒng)的內(nèi)存換頁降低,達(dá)到效率提升。像我們這里所說的errmsg只有一份,當(dāng)某函數(shù)要用errmsg時(shí),如果內(nèi)存隔得比較遠(yuǎn),會(huì)產(chǎn)生換頁,反而效率不高。
生副本導(dǎo)致執(zhí)行文件尺寸變大,不僅增加了系統(tǒng)裝載時(shí)間,也會(huì)讓一個(gè)程序在內(nèi)存中占更多的頁面。而對(duì)于errmsg這樣數(shù)據(jù),一般來說,在系統(tǒng)運(yùn)行時(shí)不會(huì)經(jīng)常用到,所以還是產(chǎn)生的內(nèi)存換頁也就不算頻繁。權(quán)衡之下,還是只有一份errmsg的效率高。即便是像logmsg這樣頻繁使用的的數(shù)據(jù),操作系統(tǒng)的內(nèi)存調(diào)度算法會(huì)讓這樣的頻繁使用的頁面常駐于內(nèi)存,所以也就不會(huì)出現(xiàn)內(nèi)存換頁問題了。
相關(guān)推薦:2009年9月計(jì)算機(jī)等級(jí)考試成績查詢匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |