C語言函數設計的一般原則和技巧
C語言之所以命名爲C,是因爲 C語言源自Ken Thompson發明的B語言,而 B語言則源自BCPL語言。下面小編給大家介紹C語言函數設計的一般原則和技巧,歡迎閱讀!
C語言函數設計的一般原則和技巧1、原則上儘量少使用全局變量,因爲全局變量的生命週期太長,容易出錯,也會長時間佔用空間.各個源文件負責本身文件的全局變量,同時提供一對對外函數,方便其它函數使用該函數來訪問變量。
比如:niSet_ValueName(…);niGet_ValueName(…);不要直接讀寫全局變量,尤其是在多線程編程時,必須使用這種方式,並且對讀寫操作加鎖。
2、參數命名要恰當,順序要合理。
例如編寫字符串拷貝函數str_copy,它有兩個參數。如果把參數名字起爲str1 和str2,例如
void str_copy (char *str1, char *str2);
那麼我們很難搞清楚究竟是把str1 拷貝到str2 中,還是剛好倒過來。
可以把參數名字起得更有意義,如叫strSource 和strDestination。這樣從名字上就可以看出應該把strSource 拷貝到strDestination。
還有一個問題,這兩個參數那一個該在前那一個該在後?參數的順序要遵循程序員的習慣。一般地,應將目的參數放在前面,源參數放在後面。如果將函數聲明爲:
void str_copy (char *strSource, char *strDestination);
別人在使用時可能會不假思索地寫成如下形式:
char str[20];
str_copy (str, “Hello World”); 參數順序顛倒
3、如果參數是指針,且僅作輸入參數用,則應在類型前加const,以防止該指針在函數體內被意外修改。例如:
void str_copy (char *strDestination,const char *strSource);
4、不要省略返回值的類型,如果函數沒有返回值,那麼應聲明爲void 類型。
如果沒有返回值,編譯器則默認爲函數的返回值是int類型的。
5、在函數體的“入口處”,對參數的有效性進行檢查。尤其是指針參數,儘量使用assert宏做入口校驗,而不使用if語句校驗。(關於此問題討論,詳見指針與數組那章。)
6、return 語句不可返回指向“棧內存”的“指針”,因爲該內存在函數體結束時被自動銷燬。例如:
char * Func(void)
{
char str[30];
…
return str;
}
str 屬於局部變量,位於棧內存中,在Func 結束的時候被釋放,所以返回str 將導致錯誤。
7、函數的功能要單一,不要設計多用途的函數。微軟的Win32 API就是違反本規則的典型,其函數往往因爲參數不一樣而功能不一,導致很多初學者迷惑。
8、函數體的規模要小,儘量控制在80 行代碼之內。
9、相同的輸入應當產生相同的輸出。儘量避免函數帶有“記憶”功能。
帶有“記憶”功能的函數,其行爲可能是不可預測的,因爲它的行爲可能取決於某種“記憶狀態“。這樣的函數既不易理解又不利於測試和維護。在C 語言中,函數的static局部變量是函數的“記憶”存儲器。建議儘量少用static 局部變量,除非必需。
10、避免函數有太多的參數,參數個數儘量控制在4個或4個以內。如果參數太多,在使用時容易將參數類型或順序搞錯。微軟的Win32 API就是違反本規則的`典型,其函數的參數往往七八個甚至十餘個。比如一個CreateWindow函數的參數就達11個之多。
11、儘量不要使用類型和數目不確定的參數。
C 標準庫函數printf 是採用不確定參數的典型代表,其原型爲:
int printf(const chat *format[, argument]…);
這種風格的函數在編譯時喪失了嚴格的類型安全檢查。
12、有時候函數不需要返回值,但爲了增加靈活性如支持鏈式表達,可以附加返回值。例如字符串拷貝函數strcpy 的原型:
char *strcpy(char *strDest,const char *strSrc);
strcpy 函數將strSrc 拷貝至輸出參數strDest 中,同時函數的返回值又是strDest。這樣做並非多此一舉,可以獲得如下靈活性:
char str[20];
int length = strlen(strcpy(str, “Hello World”) );
13、不僅要檢查輸入參數的有效性,還要檢查通過其它途徑進入函數體內的變量的有效性,例如全局變量、文件句柄等。
14、函數名與返回值類型在語義上不可衝突。
違反這條規則的典型代表就是C語言標準庫函數getchar。幾乎沒有一部名著沒有提到getchar函數,因爲它實在太經典,太容易讓人犯錯誤了。所以,每一個有經驗的作者都會拿這個例子來警示他的讀者,我這裏也是如此:
char c;
c = get);
if(EOF == c)
{
…
}
按照getchar 名字的意思,應該將變量c 定義爲char 類型。但是很不幸,getchar 函數的返回值卻是int 類型,其原型爲:
int getvoid);
由於c 是char 類型的,取值範圍是[-128,127],如果宏EOF 的值在char 的取值範圍之外,EOF 的值將無法全部保存到c 內,會發生截斷,將EOF 值的低8 位保存到c 裏。這樣if 語句有可能總是失敗。這種潛在的危險,如果不是犯過一次錯,肯怕很難發現。
-
學生會會徽設計大賽策劃書
計劃一是根據黨和國家的方針政策、上級部門的工作安排和指示精神而定,二是針對本單位的工作任務、主客觀條件和相應能力而定。總之,從實際出發制定出來的計劃,纔是有意義、有價值的計劃。下面,小編爲大家分享學生會會徽設計大賽策劃書,希望對大家有所幫助!一、活動主...
-
鳥類種類調查方案設計
統計調查方案是統計調查前所制訂的實施計劃,是全部調查過程的指導性文件。是調查工作有計劃、有組織、有系統進行的保證。統計調查方案應確定的內容有:調查目的與任務、調查對象與調查單位、調查項目與調查表、調查時間和調查時限、調查的組織實施計劃。接下來小...
-
室內設計實習心得及收穫範文
室內設計實習心得篇一爲期三個月的實習生活在不知不覺中落下了帷幕。在泛亞公司實習這段時間裏,我學到了很多在大學課堂里根本學不到的東西,也體驗到了很多人生中從未有過的經歷。因爲考慮到以後畢業有可能從事這個行業的工作,因此我非常珍惜這次實習的機會,在有限...
-
廣告設計中中國元素的應用
導語:隨着時代的發展與對外開放程度的提高,中國元素在各方面的應用愈來愈廣泛。特別是在廣告設計領域,應用中國元素能夠提高廣告設計與宣傳的效果。下面就由小編爲大家介紹一下廣告設計中中國元素的應用,希望對大家有所幫助!一、廣告設計與中國元素概念分析1.廣告設...