函數相關
1、參數的書寫要完整
參數的書寫要完整,不要貪圖省事只寫參數的類型而省略參數名字。如果函數沒有參數,則用void填充。例如:
voidSetValue(intwidth,intheight); // 良好的風格
voidSetValue(int,int); // 不良的風格
floatGetValue(void); // 良好的風格
floatGetValue(); // 不良的風格
2、參數命名要恰當,順序要合理
例如編寫字符串拷貝函數StringCopy,它有兩個參數。如果把參數名字起爲str1和str2,例如:
void StringCopy(char*str1,char*str2);
那麼我們很難搞清楚究竟是把str1拷貝到str2中,還是剛好倒過來。
可以把參數名字起得更有意義,如叫strSource
和strDestination
。這樣從名字上就可以看出應該把strSource拷貝到strDestination。
還有一個問題,這兩個參數那一個該在前那一個該在後?參數的順序要遵循程序員的習慣。一般地,應將目的參數放在前面,源參數放在後面:
void StringCopy(char*strDestination,char*strSource);
3、參數是指針
如果參數是指針,且僅作輸入用,則應在類型前加const,以防止該指針在函數體內被意外修改。
例如:
void StringCopy(char*strDestination,constchar*strSource);
這裏推薦一下我建的C/C++語言學習交流秋秋裙,前三位是:110,中間三位是:355,最後三位是:025,裏面有學習不錯視頻教程、開發工具、電子書籍,完整的項目源碼等,專業的老師解答問題!
4、不要省略返回值的類型
C語言中,凡不加類型說明的函數,一律自動按整型處理。這樣做不會有什麼好處,卻容易被誤解爲void類型。
5、函數名字與返回值類型在語義上不可衝突
違反這條規則的典型代表是C標準庫函數getchar
。例如:
charc;
c=getchar();
if(c==EOF)
…
按照getchar名字的意思,將變量c聲明爲char類型是很自然的事情。但不幸的是getchar的確不是char類型,而是int類型,其原型如下:
int getchar(void);
由於c是char類型,取值範圍是[-128,127],如果宏EOF的值在char的取值範圍之外,那麼if語句將總是失敗,這種“危險”人們一般哪裏料得到!導致本例錯誤的責任並不在用戶,是函數getchar
誤導了使用者。
6、不要將正常值和錯誤標誌混在一起返回
正常值用輸出參數獲得,而錯誤標誌用return語句返回。
回顧上例,C標準庫函數的設計者爲什麼要將getchar聲明爲令人迷糊的int類型呢?
在正常情況下,getchar的確返回單個字符。但如果getchar碰到文件結束標誌或發生讀錯誤,它必須返回一個標誌EOF。爲了區別於正常的字符,只好將EOF定義爲負數(通常爲負1)。因此函數getchar就成了int類型。
我們在實際工作中,經常會碰到上述令人爲難的問題。爲了避免出現誤解,我們應該將正常值和錯誤標誌分開。即:正常值用輸出參數獲得,而錯誤標誌用return語句返回。
函數getchar
可以改寫成BOOL GetChar(char*c);
。
7、附加返回值,增強函數的靈活性
有時候函數原本不需要返回值,但爲了增加靈活性如支持鏈式表達,可以附加返回值。例如字符串拷貝函數strcpy
的原型:
char *strcpy(char *strDest,const char *strSrc);
strcpy函數將strSrc拷貝至輸出參數strDest中,同時函數的返回值又是strDest。這樣做並非多此一舉,可以獲得如下靈活性:
char str[20];
int length=strlen(strcpy(str,“HelloWorld”));