在日常學(xué)習(xí)、工作或生活中,大家總少不了接觸作文或者范文吧,通過文章可以把我們那些零零散散的思想,聚集在一塊。大家想知道怎么樣才能寫一篇比較優(yōu)質(zhì)的范文嗎?以下是小編為大家收集的優(yōu)秀范文,歡迎大家分享閱讀。
c語言函數(shù)的編寫篇一
1、原則上盡量少使用全局變量,因為全局變量的生命周期太長,容易出錯,也會長時間占用空間.各個源文件負(fù)責(zé)本身文件的全局變量,同時提供一對對外函數(shù),方便其它函數(shù)使用該函數(shù)來訪問變量。
比如:niset_valuename(…);niget_valuename(…);不要直接讀寫全局變量,尤其是在多線程編程時,必須使用這種方式,并且對讀寫操作加鎖。
2、參數(shù)命名要恰當(dāng),順序要合理。
例如編寫字符串拷貝函數(shù)str_copy,它有兩個參數(shù)。如果把參數(shù)名字起為str1 和str2,例如
void str_copy (char *str1, char *str2);
那么我們很難搞清楚究竟是把str1 拷貝到str2 中,還是剛好倒過來。
可以把參數(shù)名字起得更有意義,如叫strsource 和strdestination。這樣從名字上就可以看出應(yīng)該把strsource 拷貝到strdestination。
還有一個問題,這兩個參數(shù)那一個該在前那一個該在后?參數(shù)的順序要遵循程序員的習(xí)慣。一般地,應(yīng)將目的參數(shù)放在前面,源參數(shù)放在后面。如果將函數(shù)聲明為:
void str_copy (char *strsource, char *strdestination);
別人在使用時可能會不假思索地寫成如下形式:
char str[20];
str_copy (str, “hello world”); 參數(shù)順序顛倒
3、如果參數(shù)是指針,且僅作輸入?yún)?shù)用,則應(yīng)在類型前加const,以防止該指針在函數(shù)體內(nèi)被意外修改。例如:
void str_copy (char *strdestination,const char *strsource);
4、不要省略返回值的類型,如果函數(shù)沒有返回值,那么應(yīng)聲明為void 類型。
如果沒有返回值,編譯器則默認(rèn)為函數(shù)的返回值是int類型的.。
5、在函數(shù)體的“入口處”,對參數(shù)的有效性進(jìn)行檢查。尤其是指針參數(shù),盡量使用assert宏做入口校驗,而不使用if語句校驗。(關(guān)于此問題討論,詳見指針與數(shù)組那章。)
6、return 語句不可返回指向“棧內(nèi)存”的“指針”,因為該內(nèi)存在函數(shù)體結(jié)束時被自動銷毀。例如:
char * func(void)
{
char str[30];
…
return str;
}
str 屬于局部變量,位于棧內(nèi)存中,在func 結(jié)束的時候被釋放,所以返回str 將導(dǎo)致錯誤。
7、函數(shù)的功能要單一,不要設(shè)計多用途的函數(shù)。微軟的win32 api就是違反本規(guī)則的典型,其函數(shù)往往因為參數(shù)不一樣而功能不一,導(dǎo)致很多初學(xué)者迷惑。
8、函數(shù)體的規(guī)模要小,盡量控制在80 行代碼之內(nèi)。
9、相同的輸入應(yīng)當(dāng)產(chǎn)生相同的輸出。盡量避免函數(shù)帶有“記憶”功能。
帶有“記憶”功能的函數(shù),其行為可能是不可預(yù)測的,因為它的行為可能取決于某種“記憶狀態(tài)“。這樣的函數(shù)既不易理解又不利于測試和維護(hù)。在c 語言中,函數(shù)的static局部變量是函數(shù)的“記憶”存儲器。建議盡量少用static 局部變量,除非必需。
10、避免函數(shù)有太多的參數(shù),參數(shù)個數(shù)盡量控制在4個或4個以內(nèi)。如果參數(shù)太多,在使用時容易將參數(shù)類型或順序搞錯。微軟的win32 api就是違反本規(guī)則的典型,其函數(shù)的參數(shù)往往七八個甚至十余個。比如一個createwindow函數(shù)的參數(shù)就達(dá)11個之多。
11、盡量不要使用類型和數(shù)目不確定的參數(shù)。
c 標(biāo)準(zhǔn)庫函數(shù)printf 是采用不確定參數(shù)的典型代表,其原型為:
int printf(const chat *format[, argument]…);
這種風(fēng)格的函數(shù)在編譯時喪失了嚴(yán)格的類型安全檢查。
12、有時候函數(shù)不需要返回值,但為了增加靈活性如支持鏈?zhǔn)奖磉_(dá),可以附加返回值。例如字符串拷貝函數(shù)strcpy 的原型:
char *strcpy(char *strdest,const char *strsrc);
strcpy 函數(shù)將strsrc 拷貝至輸出參數(shù)strdest 中,同時函數(shù)的返回值又是strdest。這樣做并非多此一舉,可以獲得如下靈活性:
char str[20];
int length = strlen(strcpy(str, “hello world”) );
13、不僅要檢查輸入?yún)?shù)的有效性,還要檢查通過其它途徑進(jìn)入函數(shù)體內(nèi)的變量的有效性,例如全局變量、文件句柄等。
14、函數(shù)名與返回值類型在語義上不可沖突。
違反這條規(guī)則的典型代表就是c語言標(biāo)準(zhǔn)庫函數(shù)getchar。幾乎沒有一部名著沒有提到getchar函數(shù),因為它實在太經(jīng)典,太容易讓人犯錯誤了。所以,每一個有經(jīng)驗的作者都會拿這個例子來警示他的讀者,我這里也是如此