C语言命名规则
??? 要求相匹配的大括號在同一列,對繼行則要求再縮進4格。例如:?????
??? 2、提示信息字符串的位置?????
??? 在程序中需要給出的提示字符串,為了支持多種語言的開發,除了一些給調試用的臨時信息外,其他所有的提示信息必須定義在資源中。?????
??? 3、對變量的定義,盡量位于函數的開始位置。????
二、命名規則:?????
??? 1、變量名的命名規則?????
??? ①、變量的命名規則要求用“匈牙利法則”。即開頭字母用變量的類型,其余部分用變量的英文意思或其英文意思的縮寫,盡量避免用中文的拼音,要求單詞的第一個字母應大寫。?????
??? 即:???? 變量名=變量類型+變量的英文意思(或縮寫)?????
??? 對非通用的變量,在定義時加入注釋說明,變量定義盡量可能放在函數的開始處。?????
??? 見下表:?????
??? bool(BOOL)???? 用b開頭???? bIsParent?????
??? byte(BYTE)???? 用by開頭???? byFlag?????
??? short(int)???? 用n開頭???? nStepCount?????
??? long(LONG)???? 用l開頭???? lSum?????
??? char(CHAR)???? 用c開頭???? cCount?????
??? float(FLOAT)???? 用f開頭???? fAvg?????
??? double(DOUBLE)???? 用d開頭???? dDeta?????
??? void(VOID)???? 用v開頭???? vVariant?????
??? unsigned???? int(WORD)???? 用w開頭???? wCount?????
??? unsigned???? long(DWORD)???? 用dw開頭???? dwBroad?????
??? HANDLE(HINSTANCE)???? 用h開頭???? hHandle?????
??? DWORD???? 用dw開頭???? dwWord?????
??? LPCSTR(LPCTSTR)???? 用str開頭???? strString?????
??? 用0結尾的字符串???? 用sz開頭???? szFileName?????
??? 對未給出的變量類型要求提出并給出命名建議給技術委員會。?????
??? ②、指針變量命名的基本原則為:?????
??? 對一重指針變量的基本原則為:?????
??? “p”+變量類型前綴+命名????
?
如一個float*型應該表示為pfStat?????
??? 對多重指針變量的基本規則為:?????
??? 二重指針:???? “pp”+變量類型前綴+命名?????
??? 三重指針:???? “ppp”+變量類型前綴+命名?????
??? ......?????
??? ③、全局變量用g_開頭,如一個全局的長型變量定義為g_lFailCount,即:變量名=g_+變量類型+變量的英文意思(或縮寫)?????
??? ④、靜態變量用s_開頭,如一個靜態的指針變量定義為s_plPerv_Inst,即:???? 變量名=s_+變量類型+變量的英文意思(或縮寫)?????
??? ⑤、成員變量用m_開頭,如一個長型成員變量定義為m_lCount;即:變量名=m_+變量類型+變量的英文意思(或縮寫)?????
??? ⑥、對枚舉類型(enum)中的變量,要求用枚舉變量或其縮寫做前綴。并且要求用大寫。?????
??? 如:enum???? cmEMDAYS?????
??? {?????
??? EMDAYS_MONDAY;?????
??? EMDAYS_TUESDAY;?????
??? ……?????
??? };?????
??? ⑦、對struct、union、class變量的命名要求定義的類型用大寫。并要加上前綴,其內部變量的命名規則與變量命名規則一致。?????
??? 結構一般用S開頭?????
??? 如:struct???? ScmNPoint?????
??? {?????
??? int???? nX;//點的X位置?????
??? int???? nY;???? //點的Y位置?????
??? };?????
??? 聯合體一般用U開頭?????
??? 如:???? union???? UcmLPoint?????
??? {?????
??? long???? lX;?????
??? long???? lY;?????
??? }?????
??? 類一般用C開頭?????
??? 如:?????
??? class???? CcmFPoint?????
??? {?????
??? public:?????
??? float???? fPoint;?????
??? };?????
??? 對一般的結構應該定義為類模板,為以后的擴展性考慮????
?
如:?????
??? template?????
??? class???? CcmTVector3d?????
??? {?????
??? public:?????
??? TYPE???? x,y,z;?????
??? };?????
??? ⑧、對常量(包括錯誤的編碼)命名,要求常量名用大寫,常量名用英文表達其意思。?????
??? 如:#define???? CM_FILE_NOT_FOUND???? CMMAKEHR(0X20B)???? 其中CM表示類別。?????
??? ⑨、對const???? 的變量要求在變量的命名規則前加入c_,即:c_+變量命名規則;例如:?????
??? const???? char*???? c_szFileName;?????
??? 2、???? 函數的命名規范:?????
??? 函數的命名應該盡量用英文表達出函數完成的功能。遵循動賓結構的命名法則,函數名中動詞在前,并在命名前加入函數的前綴,函數名的長度不得少于8個字母。?????
??? 例如:?????
??? long???? cmGetDeviceCount(……);?????
??? 3、函數參數規范:?????
??? ①、???? 參數名稱的命名參照變量命名規范。?????
??? ②、???? 為了提高程序的運行效率,減少參數占用的堆棧,傳遞大結構的參數,一律采用指針或引用方式傳遞。?????
??? ③、???? 為了便于其他程序員識別某個指針參數是入口參數還是出口參數,同時便于編譯器檢查錯誤,應該在入口參數前加入const標志。如:?????
??? ……cmCopyString(const???? char???? *???? c_szSource,???? char???? *???? szDest)?????
??? 4、引出函數規范:?????
??? 對于從動態庫引出作為二次開發函數公開的函數,為了能與其他函數以及Windows的函數區分,采用類別前綴+基本命名規則的方法命名。例如:在對動態庫 中引出的一個圖象編輯的函數定義為???? imgFunctionname(其中img為image縮寫)。?????
??? 現給出三種庫的命名前綴:?????
??? ①、???? 對通用函數庫,采用cm為前綴。?????
??? ②、???? 對三維函數庫,采用vr為前綴。?????
??? ③、???? 對圖象函數庫,采用img為前綴。?????
??? 對宏定義,結果代碼用同樣的前綴。?????
??? 5、文件名(包括動態庫、組件、控件、工程文件等)的命名規范:?????
??? 文件名的命名要求表達出文件的內容,要求文件名的長度不得少于5個字母,嚴禁使用象file1,myfile之類的文件名。????
三、注釋規范:?????
??? 1、函數頭的注釋?????
??? 對于函數,應該從“功能”,“參數”,“返回值”、“主要思路”、“調用方法”、“日期”六個方面用如下格式注釋:?????
??? //程序說明開始
//================================================================//?????
??? //???? 功能:???? 從一個String???? 中刪除另一個String。?????
??? //???? 參數:???? strByDelete,strToDelete?????
??? //???? (入口)???? strByDelete:???? 被刪除的字符串(原來的字符串)?????
??? //???? (出口)???? strToDelete:???? 要從上個字符串中刪除的字符串。?????
??? //???? 返回:???? 找到并刪除返回1,否則返回0。(對返回值有錯誤編碼的要//???? 求列出錯誤編碼)。?????
??? //???? 主要思路:本算法主要采用循環比較的方法來從strByDelete中找到?????
??? //???? 與strToDelete相匹配的字符串,對多匹配strByDelete?????
??? //???? 中有多個strToDelete子串)的情況沒有處理。請參閱:?????
??? //???? 書名......?????
??? //???? 調用方法:......?????
??? //???? 日期:起始日期,如:2000/8/21.9:40--2000/8/23.21:45?????
??? //================================================================//?????
??? 函數名(……)?????
??? //程序說明結束?????
??? ①、???? 對于某些函數,其部分參數為傳入值,而部分參數為傳出值,所以對參數要詳細說明該參數是入口參數,還是出口參數,對于某些意義不明確的參數還要做詳細說明 (例如:以角度作為參數時,要說明該角度參數是以弧度(PI),還是以度為單位),對既是入口又是出口的變量應該在入口和出口處同時標明。等等。?????
??? ②、???? 函數的注釋應該放置在函數的頭文件中,在實現文件中的該函數的實現部分應該同時放置該注釋。?????
??? ③、???? 在注釋中應該詳細說明函數的主要實現思路、特別要注明自己的一些想法,如果有必要則應該寫明對想法產生的來由。對一些模仿的函數應該注釋上函數的出處。?????
??? ④、???? 在注釋中詳細注明函數的適當調用方法,對于返回值的處理方法等。在注釋中要強調調用時的危險方面,可能出錯的地方。?????
??? ⑤、???? 對日期的注釋要求記錄從開始寫函數到結束函數的測試之間的日期。?????
??? ⑥、???? 對函數注釋開始到函數命名之間應該有一組用來標識的特殊字符串。?????
??? 如果算法比較復雜,或算法中的變量定義與位置有關,則要求對變量的定義進行圖解。對難以理解的算法能圖解盡量圖解。?????
??? 2、變量的注釋:?????
??? 對于變量的注釋緊跟在變量的后面說明變量的作用。原則上對于每個變量應該注釋,但對于意義非常明顯的變量,如:i,j等循環變量可以不注釋。?????
??? 例如:???? long???? lLineCount???? //線的根數。?????
??? 3、文件的注釋:?????
??? 文件應該在文件開頭加入以下注釋:?????
??? /?????
??? //???? 工程:???? 文件所在的項目名。?????
??? //???? 作者:**,修改者:**?????
??? //???? 描述:說明文件的功能。?????
??? //???? 主要函數:…………?????
??? //???? 版本:???? 說明文件的版本,完成日期。????
?
//???? 修改:???? 說明對文件的修改內容、修改原因以及修改日期。?????
??? //???? 參考文獻:???? ......?????
??? /?????
??? 為了頭文件被重復包含要求對頭文件進行定義如下:?????
??? #ifndef???? __FILENAME_H__?????
??? #define???? __FILENAME_H__?????
??? 其中FILENAME為頭文件的名字。?????
??? 4、其他注釋:?????
??? 在函數內我們不需要注釋每一行語句。但必須在各功能模塊的每一主要部分之前添加塊注釋,注釋每一組語句,在循環、流程的各分支等,盡可能多加以注釋。?????
??? 其中的循環、條件、選擇等位置必須注釋。?????
??? 對于前后順序不能顛倒的情況,建議在注釋中增加序號。?????
??? 例如:?????
??? 在其他順序執行的程序中,每隔3—5行語句,必須加一個注釋,注明這一段語句所組成的小模塊的作用。對于自己的一些比較獨特的思想要求在注釋中標明。????
四、程序健壯性:?????
??? 1、函數的返回值規范:?????
??? 對于函數的返回位置,盡量保持單一性,即一個函數盡量做到只有一個返回位置。(單入口單出口)。?????
??? 要求大家統一函數的返回值,所有的函數的返回值都將以編碼的方式返回。?????
??? 例如編碼定義如下:?????
??? #define???? CM_POINT_IS_NULL???? CMMAKEHR(0X200)?????
??? :?????
??? :?????
??? 建議函數實現如下:?????
??? long???? 函數名(參數,……)?????
??? {?????
??? long???? lResult;???? //保持錯誤號?????
??? lResult=CM_OK;?????
??? //如果參數有錯誤則返回錯誤號?????
??? if(參數==NULL)?????
??? {?????
??? lResult=CM_POINT_IS_NULL;?????
??? goto???? END;?????
??? }?????
??? ……?????
??? END:????
?
return???? lResult;?????
??? }?????
??? 2、關于goto的應用:?????
??? 對goto語句的應用,我們要求盡量少用goto語句。對一定要用的地方要求只能向后轉移。?????
??? 3、資源變量的處理(資源變量是指消耗系統資源的變量):?????
??? 對資源變量一定賦初值。分配的資源在用完后必須馬上釋放,并重新賦值。?????
??? 4、對復雜的條件判斷,為了程序的可讀性,應該盡量使用括號。?????
??? 例:if(((szFileName!=NULL)&&(lCount>=0)))||(bIsRead==TRUE))?????
五、可移植性:?????
??? 1、高質量的代碼要求能夠跨平臺,所以我們的代碼應該考慮到對不同的平臺的支持,特別是對windows 98和windows nt的支持。?????
??? 2、由于C語言的移植性比較好,所以對算法函數要求用C代碼,不能用C++代碼。?????
??? 3、對不同的硬件與軟件的函數要做不同的處
轉載于:https://www.cnblogs.com/defias/p/3313741.html
總結
- 上一篇: svn使用经验---不断总结
- 下一篇: 各种排序总结(一)直接插入排序