版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C/C+語言編碼規(guī)范文件狀態(tài): 草稿 正式發(fā)布 正在修改文件標(biāo)識(shí):編碼規(guī)范當(dāng)前版本:1.0作 者:劉文完成日期:2010-02-17上海涌能能源科技發(fā)展有限公司文檔修訂記錄版本編號(hào)或者更改記錄編號(hào)*變化狀態(tài)簡要說明日期變更人審核日期審核人*變化狀態(tài):A增加,M修改,D刪除文檔審批信息職務(wù)簽字日期目 錄1. 目的42. 適用范圍43. 定義44. 職責(zé)45. 流程圖56. 內(nèi)容和要求56.1 基本原則56.2 布局66.2.1 文件布局66.2.2 基本格式96.2.3 對(duì)齊106.2.4 空行空格116.2.5 斷行136.2.6 預(yù)處理指令136.3 注釋136.4 命名規(guī)則186.5 變量
2、、常量、宏與類型226.5.1 變量與常量226.5.2 宏246.5.3 類型256.6 表達(dá)式與語句276.7 函數(shù)與過程316.7.1 參數(shù)316.7.2 返回值326.7.3 內(nèi)部實(shí)現(xiàn)336.7.4 函數(shù)調(diào)用356.8 可靠性366.8.1 內(nèi)存使用366.8.2 指針使用376.8.3 類和函數(shù)386.9 可測試性396.10 斷言與錯(cuò)誤處理407. 相關(guān)文件428. 記錄表單421 1. 目的 1.1 編寫本標(biāo)準(zhǔn)的目的是為了統(tǒng)一公司軟件編程風(fēng)格,提高軟件源程序的可讀性、可靠性和可重用性,提高軟件源程序的質(zhì)量和可維護(hù)性,減少軟件維護(hù)成本,最終提高軟件產(chǎn)品生產(chǎn)力。1.2 本規(guī)范是針對(duì)C
3、、C+語言的編程規(guī)范,其它不同編程語言可以參照此規(guī)范執(zhí)行。本規(guī)范適用于公司所有產(chǎn)品的軟件源程序,同時(shí)考慮到不同產(chǎn)品和項(xiàng)目的實(shí)際開發(fā)特性,本規(guī)范分成規(guī)則性和建議性兩種:對(duì)于規(guī)則性規(guī)范,要求所有軟件開發(fā)人員嚴(yán)格執(zhí)行;對(duì)于建議性規(guī)范,各項(xiàng)目編程人員可以根據(jù)實(shí)際情況選擇執(zhí)行。本規(guī)范的示例都以C+語言描述。 1.3 本規(guī)范的內(nèi)容包括:基本原則、布局、注釋、命名規(guī)則、變量常量與類型、表達(dá)式與語句、函數(shù)與過程、可靠性、可測性、斷言與錯(cuò)誤處理等。 2 2. 適用范圍 2.1 本標(biāo)準(zhǔn)規(guī)定了C+語言的編程規(guī)范,而不是編程的技巧。 2.2 本標(biāo)準(zhǔn)適用于公司內(nèi)使用C+語言編碼的所有軟件。本規(guī)范自生效之日起,對(duì)以后新編
4、寫的和修改的代碼有約束力。 3 3. 定義 下列術(shù)語和定義適用于本標(biāo)準(zhǔn): 3.1 原則:編程時(shí)應(yīng)該堅(jiān)持的指導(dǎo)思想。 3.2 規(guī)則:編程時(shí)必須遵守的約定。 3.3 建議:編程時(shí)必須加以考慮的約定。 3.4 說明:對(duì)此規(guī)則或建議的必要的解釋。 3.5 正例:對(duì)此規(guī)則或建議給出的正確例子。 3.6 反例:對(duì)此規(guī)則或建議給出的反面例子。 4 4. 職責(zé) 4.1 主任設(shè)計(jì)師負(fù)責(zé)此文件的制定和完善。 4.2 他設(shè)計(jì)師依照此文件執(zhí)行C+語言編碼。 5 5. 流程圖 無6 6. 內(nèi)容和要求 6.1 基本原則 6.1.1 編寫程序是為人閱讀,其次才是計(jì)算機(jī)。 說明:該原則是軟件開發(fā)的基本要點(diǎn),軟件生命周期貫穿于
5、產(chǎn)品的開發(fā)、測試、生產(chǎn)、用戶使用、版本升級(jí)和后期維護(hù)等長期過程,只有易讀、易維護(hù)的軟件代碼才具有生命力。 6.1.2 保持代碼的簡明清晰,避免過分或刻意的追求編程技巧。 說明:簡單是最美。保持代碼的簡單化是軟件工程化的基本要求。不要過分追求技巧,否則會(huì)降低程序的可讀性。 6.1.3 所有的代碼盡量遵循ANSI 標(biāo)準(zhǔn)。 說明:所有的代碼盡可能遵循ANSI 標(biāo)準(zhǔn),盡可能不使用ANSI未定義的或編譯器擴(kuò)展的功能。6.1.4 編程時(shí)首先以達(dá)到正確性為目的,其次再考慮效率。 說明:編程首先考慮的是滿足正確性、健壯性、可維護(hù)性、可移植性等質(zhì)量因素,最后才考慮程序的效率和資源占用。 6.1.5 避免或少用全
6、局變量。 說明:過多地使用全局變量,會(huì)導(dǎo)致模塊間的緊耦合,違反模塊化的要求。 6.1.6 盡可能重用代碼。 說明:盡量選擇可借用的代碼,對(duì)其修改、優(yōu)化以達(dá)到自身使用要求。 6.1.7 團(tuán)隊(duì)合作。說明:編程規(guī)范的使用要點(diǎn)在于提供一個(gè)開發(fā)團(tuán)隊(duì)共同遵守的樣本,沒有所謂對(duì)和錯(cuò)。團(tuán)隊(duì)所有成員可以把精力集中在實(shí)現(xiàn)內(nèi)容而不是表現(xiàn)形式上。本文給出了主要的風(fēng)格規(guī)范,但個(gè)人的風(fēng)格也很重要,如果你在一個(gè)文件中新加的代碼和原有代碼風(fēng)格相去甚遠(yuǎn)的話,這就破壞了文件本身的整體美觀也影響閱讀,所以要盡量避免。 6.2 布局 程序布局的目的是展現(xiàn)程序良好的邏輯結(jié)構(gòu),以提高程序的準(zhǔn)確性、連續(xù)性、可讀性、可維護(hù)性。更重要的是,統(tǒng)
7、一的程序布局和編程風(fēng)格,有助于提高整個(gè)項(xiàng)目的開發(fā)質(zhì)量,提高開發(fā)效率,降低開發(fā)成本。同時(shí),對(duì)于程序員來說,養(yǎng)成良好的編程習(xí)慣有助于提高自己的編程水平,提高編程效率。 6.2.1 文件布局 【規(guī)則2-1-1】遵循統(tǒng)一的布局順序來書寫頭文件 說明:以下內(nèi)容如果某些節(jié)不需要,可以忽略。但是其它節(jié)要保持該次序。 頭文件布局:a) 文件頭注釋(參見 “注釋”章節(jié)) b) #ifndef 文件名_H(全大寫)(用來避免重復(fù)包含) #define 文件名_H c) 其它條件編譯選項(xiàng) d) #include(依次為標(biāo)準(zhǔn)庫頭文件、非標(biāo)準(zhǔn)庫頭文件) e) 與C+編譯器適應(yīng)extern “C”聲明前綴 f) 全局宏
8、g) 常量定義 h) 全局?jǐn)?shù)據(jù)類型 i) 類/結(jié)構(gòu)的聲明 j) 模板(template)(包括C+中的類模板和函數(shù)模板) k) 輸出函數(shù)部分 l) 與C+編譯器適應(yīng)extern “C”聲明前綴結(jié)束; m) 需要包含的內(nèi)聯(lián)函數(shù)定義文件 #endif【規(guī)則2-1-2】遵循統(tǒng)一的布局順序來書寫實(shí)現(xiàn)文件 說明:一個(gè)定義文件實(shí)現(xiàn)一組功能相關(guān)的函數(shù)接口和子函數(shù)接口,不能同時(shí)實(shí)現(xiàn)不同頭文件聲明的函數(shù)接口,它主要包含如下幾個(gè)部分:(規(guī)范不強(qiáng)求具體文件涵蓋下面所有內(nèi)容,對(duì)存在的內(nèi)容則應(yīng)按照以下順序排放;和頭文件相同的項(xiàng)目,要求同頭文件構(gòu)成部分相同)。 實(shí)現(xiàn)文件布局: a) 文件頭注釋(參見 “注釋”章節(jié)) b)
9、 #include(依次為標(biāo)準(zhǔn)庫頭文件、非標(biāo)準(zhǔn)庫頭文件)將僅與實(shí)現(xiàn)相關(guān)的類、函數(shù)及數(shù)據(jù)的頭文件包含在實(shí)現(xiàn)文件里(而不是頭文件中)是一個(gè)非常好的編程習(xí)慣。這樣可以有效地屏蔽不應(yīng)該暴露的實(shí)現(xiàn)細(xì)節(jié),將實(shí)現(xiàn)改變對(duì)其它模塊的影響降低到最少 。 c) 文件內(nèi)部使用的宏d) 常量定義e) 文件內(nèi)部使用的數(shù)據(jù)類型f) 外部可以使用的全局?jǐn)?shù)據(jù)定義部分g) 本地變量(即靜態(tài)全局變量)h) 局部函數(shù)原型(文件范圍內(nèi)的函數(shù)原型聲明)i) 類的實(shí)現(xiàn)j) 全局函數(shù)k) 局部函數(shù) l) 實(shí)現(xiàn)文件的編碼規(guī)則: 分割每個(gè)部分:在本地(靜態(tài))定義和外部定義間,以及不同接口或不同類的實(shí)現(xiàn)之間,應(yīng)使用注釋塊(注釋塊見下面解釋)相互分
10、開。 【規(guī)則2-1-3】使用注釋塊分離上面定義的節(jié) 正例: / * * 數(shù)據(jù)類型定義 * * / typedef unsigned char BOOLEAN; /* * 函數(shù)原型 * */ int HelloWorld(void); 【規(guī)則2-1-4】包含標(biāo)準(zhǔn)庫頭文件用尖括號(hào) ,包含非標(biāo)準(zhǔn)庫頭文件用雙引號(hào) “ ”正例: #include #include “MMS.h” 【規(guī)則2-1-5】遵循統(tǒng)一的風(fēng)格書寫類(class)的定義及實(shí)現(xiàn) 說明:類定義文件中類容按如下順序書寫: a) 注釋頭與類聲明: 與文件一樣,每個(gè)類應(yīng)當(dāng)有一個(gè)注釋頭用來說明該類的各個(gè)方面。類聲明換行緊跟在注釋頭后面,class
11、 關(guān)鍵字由行首開始書寫,后跟類名稱。界定符 和 ; 應(yīng)獨(dú)占一行,并與 class 關(guān)鍵字左對(duì)其。 b) 繼承: 基類直接跟在類名稱之后,不換行,訪問說明符(public, private, 或protected)不可省略。如:class CXXX : public CAAA, private CBBB / . ; c) 初始化列表:應(yīng)當(dāng)盡可能通過構(gòu)造函數(shù)的初始化列表來初始化成員和基類。初始化列表至少獨(dú)占一行,并且與構(gòu)造函數(shù)的定義保持4 個(gè)空格的縮進(jìn)。如: CXXX:CXXXX(IN int nA, IN bool bB): m_nA(nA), m_bB(bB) / . ; 初始化列表的書寫順序
12、應(yīng)當(dāng)與對(duì)象的構(gòu)造順序一致,即:先按照聲明順序?qū)懟惓跏蓟侔凑章暶黜樞驅(qū)懗蓡T初始化。 d) 嵌套的類聲明:在相應(yīng)的邏輯關(guān)系確實(shí)存在時(shí),類聲明可以嵌套。嵌套類可以使用簡單的單行注釋頭。 e) 公有屬性 f) 公有函數(shù) g) 保護(hù)屬性 h) 保護(hù)函數(shù) i) 私有屬性 j) 私有函數(shù) 訪問說明符(public, private, 或protected)應(yīng)該獨(dú)占一行,并與類聲明中的class關(guān)鍵字左對(duì)齊。k) 類實(shí)現(xiàn)文件內(nèi)容按如下順序書寫: 構(gòu)造函數(shù)析構(gòu)函數(shù) 公有函數(shù) 保護(hù)函數(shù) 私有函數(shù) 【規(guī)則2-1-6】內(nèi)聯(lián)函數(shù)定義文件 在內(nèi)聯(lián)函數(shù)較多的情況下,為了避免頭文件過長、版面混亂,可以將所有的內(nèi)聯(lián)函數(shù)定
13、義移到一個(gè)單獨(dú)的文件中去,然后再用#include指令將它包含到類聲明的后面。這樣的文件稱為一個(gè)內(nèi)聯(lián)函數(shù)定義文件。 按照慣例,應(yīng)該將這個(gè)文件命名為“filename.inl”,其中“filename”與相應(yīng)的頭文件和實(shí)現(xiàn)文件相同。 內(nèi)聯(lián)函數(shù)定義文件由以下幾部分組成: 文件頭注釋:每內(nèi)聯(lián)函數(shù)定義文件都應(yīng)該由一個(gè)規(guī)范的文件頭注釋作為開始 內(nèi)聯(lián)函數(shù)定義:內(nèi)聯(lián)函數(shù)的實(shí)現(xiàn)體 6.2.2 基本格式 【規(guī)則2-2-1】程序中一行的代碼和注釋不能超過80列說明:包括空格在內(nèi)不超過80 列。 【規(guī)則2-2-2】if、else、else if、for、while、do等語句自占一行,執(zhí)行語句不得緊跟其后。不論執(zhí)行
14、語句有多少都要加 。 說明:這樣易于閱讀,也容易檢查錯(cuò)誤。 正例: if (varible1 varible2) varible1 = varible2; 反例:下面的代碼中執(zhí)行語句緊跟在if條件之后,而且沒有加,違反規(guī)則。 if (varible1 ”這類操作符前后不加空格。正例: !bValue iValue +iCount *strSource &fSum aiNumberi = 5; tBox.dWidth tBox-dWidth 【規(guī)則2-4-3】多元運(yùn)算符和它們的操作數(shù)之間至少需要一個(gè)空格。 正例: fValue = fOldValue; fTotal + fValue iNumb
15、er += 2; 【規(guī)則2-4-4】函數(shù)名之后不要留空格。 說明:函數(shù)名后緊跟左括號(hào)(,以與關(guān)鍵字區(qū)別。 【規(guī)則2-4-6】注釋符與注釋內(nèi)容之間要用一個(gè)空格進(jìn)行分隔。 正例: /* 注釋內(nèi)容 */ 注釋內(nèi)容反例:/*注釋內(nèi)容*/ /注釋內(nèi)容 6.2.5 斷行 【規(guī)則2-5-1】長表達(dá)式(超過80 列)要在低優(yōu)先級(jí)操作符處拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊。 說明:條件表達(dá)式的續(xù)行在第一個(gè)條件處對(duì)齊。 for循環(huán)語句的續(xù)行在初始化條件語句處對(duì)齊。 函數(shù)調(diào)用和函數(shù)聲明的續(xù)行在第一個(gè)參數(shù)處對(duì)齊。 賦值語句的續(xù)行應(yīng)在賦值號(hào)處對(duì)齊。 正例: if
16、(iFormat = CH_A_Format_M) & (iOfficeType = CH_BSC_M) / 條件表達(dá)式的續(xù)行在第一個(gè)條件處對(duì)齊 DoSomething(); for (long_initialization_statement; long_condiction_statement;/ for循環(huán)語句續(xù)行在初始化條件語句處對(duì)齊long_update_statement) DoSomething();/ 函數(shù)聲明的續(xù)行在第一個(gè)參數(shù)處對(duì)齊BYTE ReportStatusCheckPara(HWND hWnd, BYTE ucCallNo,BYTE ucStatusReportNo
17、);/ 賦值語句的續(xù)行應(yīng)在賦值號(hào)處對(duì)齊fTotalBill = fTotalBill + faCustomerPurchasesiID+ fSalesTax(faCustomerPurchasesiID); 6.2.6 預(yù)處理指令 【規(guī)則2-6-1】預(yù)處理指令不要縮進(jìn),從行首開始。即使預(yù)處理指令位于縮進(jìn)代碼塊中,指令也應(yīng)從行首開始。 6.3 注釋 注釋有助于理解代碼,有效的注釋是指在代碼的功能、邏輯層次上進(jìn)行注釋,提供有用、額外的信息,而不是代碼表面意義的簡單重復(fù)。 【規(guī)則3-1】多行注釋采用“/* */”,單行注釋采用“/ ”。 【規(guī)則3-2】一般情況下,源程序有效注釋量必須在30以上 說明
18、:注釋的原則是有助于對(duì)程序的閱讀理解,注釋不宜太多也不能太少,注釋語言必須準(zhǔn)確、易懂、簡潔。有效的注釋是指在代碼的功能、邏輯層次上進(jìn)行注釋,提供有用、額外的信息。 【規(guī)則3-3】注釋使用中文。說明:對(duì)于特殊要求的可以使用英文注釋,如工具不支持中文或國際化版本時(shí)。【規(guī)則3-4】文件頭部必須進(jìn)行注釋,包括:.h 文件、.cpp 文件、.inc 文件、.def 文件、編譯說明文件.cfg等。 說明:注釋必須列出:版權(quán)信息、文件標(biāo)識(shí)、內(nèi)容摘要、版本號(hào)、作者、完成日期、修改信息等。正例: 下面是文件頭部的中文注釋: /* * 版權(quán)所有 (C)2010, 上海思源弘瑞自動(dòng)化股份公司 * * 文件名稱: /
19、 文件名 * 內(nèi)容摘要: / 簡要描述本文件的內(nèi)容,包括主要模塊、函數(shù)及其功能的說明 * 其它說明: / 其它內(nèi)容的說明 * 當(dāng)前版本: / 輸入當(dāng)前版本 * 作 者: / 輸入作者名字及單位 * 完成日期: / 輸入完成日期,例:2010年5月15日* * 修改記錄1:/ 修改歷史記錄,包括修改日期、修改者及修改內(nèi)容 * 修改日期: * 版 本 號(hào): * 修 改 人: * 修改內(nèi)容: * 修改記錄2: */ 下面是文件頭部的英文注釋: /* * Copyright (C) 2010, SHR Corporation. * * File Name: / 文件名 (注釋對(duì)齊) * Descrip
20、tion: / 簡要描述本文件的內(nèi)容,完成的主要功能 * Others: / 其它內(nèi)容的說明 * Version: / 輸入當(dāng)前版本 * Author: / 輸入作者名字及單位 * Date: / 輸入完成日期,例:2010-05-15 * * History 1: / 修改歷史記錄,包括修改日期、修改者及修改內(nèi)容 * Date: * Version: * Author: * Modification: * History 2: */ 【規(guī)則3-5】函數(shù)頭部應(yīng)進(jìn)行注釋,列出:函數(shù)的目的/功能、輸入?yún)?shù)、輸出參數(shù)、返回值、修改信息等。 說明:注釋必須列出:函數(shù)名稱、功能描述、輸入?yún)?shù)、輸出參數(shù)、
21、返 回 值、修改信息等。正例: 下面是函數(shù)頭部的中文注釋: /* * 函數(shù)名稱: / 函數(shù)名稱 * 功能描述: / 函數(shù)功能、性能等的描述 * 輸入?yún)?shù): / 輸入?yún)?shù)說明,包括每個(gè)參數(shù)的作用、取值說明及參數(shù)間關(guān)系 * 輸出參數(shù): / 對(duì)輸出參數(shù)的說明。 * 返 回 值: / 函數(shù)返回值的說明 * 其它說明: / 其它說明 * 修改日期 版本號(hào) 修改人 修改內(nèi)容 * -* 2010/08/01 V1.0 XXXX XXXX */ 下面是函數(shù)頭部的英文注釋: /* * Function: / 函數(shù)名稱(注釋對(duì)齊) * Description: / 函數(shù)功能、性能等的描述 * Input: / 輸
22、入?yún)?shù)說明,包括每個(gè)參數(shù)的作用、取值說明以及參數(shù)間關(guān)系 * Output: / 對(duì)輸出參數(shù)的說明 * Return: / 函數(shù)返回值的說明 * Others: / 其它說明 * Modify Date Version Author Modification * -* 2010/08/01 V1.0 XXXX XXXX */ 【規(guī)則3-6】包含在 中代碼塊的結(jié)束處應(yīng)加注釋,便于閱讀。特別是多分支、多重嵌套的條件語句或循環(huán)語句。說明:此時(shí)注釋可以用英文,方便查找對(duì)應(yīng)的語句。正例: void Main() If() while() /* end of while() */ / 指明該條while 語
23、句結(jié)束 /* end of if() */ / 指明是if語句結(jié)束 /* end of void main()*/ / 指明函數(shù)的結(jié)束【規(guī)則3-7】保證代碼和注釋的一致性。修改代碼同時(shí)修改相應(yīng)的注釋,不再有用的注釋要?jiǎng)h除。 【規(guī)則3-8】注釋應(yīng)與其描述的代碼相近,對(duì)代碼的注釋應(yīng)放在其上方或右方(對(duì)單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。說明:在使用縮寫時(shí)或之前,應(yīng)對(duì)縮寫進(jìn)行必要的說明。 正例: 如下書寫比較結(jié)構(gòu)清晰:/* 獲得子系統(tǒng)索引 */ iSubSysIndex = aDataiIndex.iSysIndex; /* 代碼段1注釋 */ 代碼段1
24、/* 代碼段2注釋 */ 代碼段2 反例1: 如下例子注釋與描述的代碼相隔太遠(yuǎn):/* 獲得子系統(tǒng)索引 */ iSubSysIndex = aDataiIndex.iSysIndex; 反例2:如下例子注釋不應(yīng)放在所描述的代碼下面:iSubSysIndex = aDataiIndex.iSysIndex; /* 獲得子系統(tǒng)索引 */ 反例3: 如下例子,顯得代碼與注釋過于緊湊:/* 代碼段1注釋 */ 代碼段1 /* 代碼段2注釋 */ 代碼段2 【規(guī)則3-9】全局變量要有詳細(xì)的注釋,包括對(duì)其功能、取值范圍、訪問信息及訪問時(shí)注意事項(xiàng)等的說明。 正例: /* * 變量作用:(錯(cuò)誤狀態(tài)碼) * 變量
25、范圍:例如0 - SUCCESS 1 ERROR * 訪問說明:(訪問的函數(shù)以及方法) */ BYTE g_btTranErrorCode; 【規(guī)則3-10】注釋與所描述內(nèi)容進(jìn)行同樣的縮排。說明:可使程序排版整齊,并方便注釋的閱讀與理解。正例: 如下注釋結(jié)構(gòu)比較清晰 int DoSomething(void) /* 代碼段1注釋 */ 代碼段1 /* 代碼段2注釋 */ 代碼段2 【規(guī)則3-11】對(duì)分支語句(條件分支、循環(huán)語句等)必須編寫注釋。說明:這些語句往往是程序?qū)崿F(xiàn)某一特殊功能的關(guān)鍵,對(duì)于維護(hù)人員來說,良好的注釋有助于更好的理解程序,有時(shí)甚至優(yōu)于看設(shè)計(jì)文檔。 建議3-1通過對(duì)函數(shù)或過程、
26、變量、結(jié)構(gòu)等正確的命名以及合理地組織代碼結(jié)構(gòu),使代碼成為自注釋的。 說明:清晰準(zhǔn)確的函數(shù)、變量命名,可增加代碼的可讀性,減少不必要的注釋?!疽?guī)則3-12】注釋掉整塊的代碼使用#if 0 和#endif。 【規(guī)則3-13】避免在一行代碼或表達(dá)式的中間插入注釋。6.4 命名規(guī)則 好的命名規(guī)則能極大地增加可讀性和可維護(hù)性。同時(shí),對(duì)于一個(gè)由多個(gè)個(gè)體共同完成的項(xiàng)目來說,統(tǒng)一的命名約定也是一項(xiàng)必不可少的內(nèi)容?!疽?guī)則4-1】標(biāo)識(shí)符要采用英文單詞或其組合,便于記憶和閱讀,切忌使用漢語拼音來命名。說明:標(biāo)識(shí)符應(yīng)當(dāng)直觀且可以拼讀,可望文知義,避免使人產(chǎn)生誤解。程序中的英文單詞一般不要太復(fù)雜,用詞應(yīng)當(dāng)準(zhǔn)確?!疽?guī)則4
27、-2】標(biāo)識(shí)符只能由26個(gè)英文字母、10個(gè)數(shù)字及下劃線來組成.除非針對(duì)硬件的驅(qū)動(dòng)程序或操作系統(tǒng)相關(guān)的等底層程序外,嚴(yán)格禁止使用連續(xù)的下劃線,下劃線也不能出現(xiàn)在標(biāo)識(shí)符頭或結(jié)尾(預(yù)編譯開關(guān)除外)。 說明:這樣做的目的是為了使程序易讀。因?yàn)?variable_name 和 variable_name 很難區(qū)分,下劃線符號(hào)_若出現(xiàn)在標(biāo)識(shí)符頭或結(jié)尾,容易與不帶下劃線_的標(biāo)識(shí)符混淆。【規(guī)則4-3】標(biāo)識(shí)符的命名應(yīng)當(dāng)符合“min-length & max-information”原則 說明:較短的單詞可通過去掉“元音”形成縮寫,較長的單詞可取單詞的頭幾個(gè)字母形成縮寫,一些單詞有大家公認(rèn)的縮寫,常用單詞的縮寫必須
28、統(tǒng)一。協(xié)議中的單詞的縮寫與協(xié)議保持一致。對(duì)于某個(gè)系統(tǒng)使用的專用縮寫應(yīng)該在某處做統(tǒng)一說明。 正例:如下單詞的縮寫能夠被大家認(rèn)可: temp 可縮寫為 tmp ; flag 可縮寫為 flg ; statistic 可縮寫為 stat ; increment 可縮寫為 inc ; message 可縮寫為 msg ; 【規(guī)則4-4】程序中不要出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識(shí)符【規(guī)則4-5】用正確的反義詞組命名具有互斥意義的變量或相反動(dòng)作的函數(shù)等。 說明:下面是一些在軟件中常用的反義詞組。 add/remove;begin/end; create/destroy;insert/delete;first
29、/last;get/release; increment/decrement; put/get;add/delete;lock/unlock; open/close;min/max;old/new;start/stop; next/previous;source/target;show/hide;send/receive; source/destination; cut/paste;up/down【規(guī)則4-6】宏、常量名都要使用大寫字母, 用下劃線 _ 分割單詞。預(yù)編譯開關(guān)的定義使用下劃線 _ 開始。 正例:如 DISP_BUF_SIZE、MIN_VALUE、MAX_VALUE 等等。 【規(guī)則
30、4-7】變量名長度應(yīng)小于31 個(gè)字符,以保持與ANSI C 標(biāo)準(zhǔn)一致。不得取單個(gè)字符(如i、j、k等)作為變量名,但是局部循環(huán)變量除外。 說明:變量,尤其是局部變量,如果用單個(gè)字符表示,很容易出錯(cuò)(如l 誤寫成1),而編譯時(shí)又檢查不出,則有可能增加排錯(cuò)時(shí)間。過長的變量名會(huì)增加工作量,會(huì)使程序的邏輯流程變得模糊,給修改帶來困難,所以應(yīng)當(dāng)選擇精煉、意義明確的名字,才能簡化程序語句,改善對(duì)程序功能的理解。 【規(guī)則4-8】程序中局部變量不能與全局變量重名。 說明:盡管局部變量和全局變量的作用域不同而不會(huì)發(fā)生語法錯(cuò)誤,但容易使人誤解。 【規(guī)則4-9】 使用一致的前綴來區(qū)分變量的作用域,變量類型分為全局、
31、靜態(tài)、局部等,它們的標(biāo)識(shí)分別為g、s、l。對(duì)于局部變量應(yīng)當(dāng)省略,此時(shí)需去掉“_”。 說明:變量活動(dòng)范圍前綴規(guī)范如下: g_:全局變量s_:模塊內(nèi)靜態(tài)變量空:局部變量不加范圍前綴【規(guī)則4-10】使用一致的小寫類型指示符作為前綴來區(qū)分變量的類型。說明:常用變量類型前綴列表如下: a(arr): 數(shù)組,array of TYPE b : BOOL c : char d : double dw: DWORD 或 unsigned long f : float h : HANDLE i : int l : long n :unsigned int p : pointer sz(str) : 字符串 t
32、: 結(jié)構(gòu)類型 uc : unsigned char 或 BYTE w : unsigned short 或 WORD 以上前綴可以進(jìn)一步組合,在進(jìn)行組合時(shí),數(shù)組和指針類型的前綴指示符必須放在變量類型前綴的首位。 針對(duì)鏈表類型的變量,數(shù)據(jù)類型不在變量前綴中體現(xiàn),而是在變量主體標(biāo)識(shí)結(jié)束后添加List/Head 標(biāo)識(shí),或者_(dá)list/_head。 示例: 局部無符號(hào)八位整數(shù)tripCount 的命名:nTripCount;無符號(hào)整數(shù)數(shù)組可以寫成:nTripCounts;靜態(tài)掛起請(qǐng)求數(shù)據(jù)結(jié)構(gòu)鏈表:s_ptPendReqList or s_ptPendReq_head;【規(guī)則4-11】完整的變量名應(yīng)由前
33、綴+變量名主體組成,變量名的主體應(yīng)當(dāng)使用“名詞”或者“形容詞名詞”,且所有單詞均以大寫字母開始其余以小些字母書寫,單詞連續(xù)書寫。說明:1) 各種前綴字符可能組合使用,在這種情況下,各前綴順序?yàn)椋鹤兞孔饔糜蚯熬Y、變量類型前綴。2) 縮寫的單詞按照慣例是大小寫的,整個(gè)單詞全部按照慣例書寫。 正例: float g_fValue; /類型為浮點(diǎn)數(shù)的全局變量 char *pcOldChar; /類型為字符指針的局部變量 s_ptPendReqList; /*靜態(tài)掛起請(qǐng)求數(shù)據(jù)結(jié)構(gòu)鏈表, 符合規(guī)范 */ 智能設(shè)備IED 的名稱:szIEDName; /* 符合規(guī)范 */ 反例: s_ptPend_req_
34、list;/* 不符合規(guī)范 pend和req 應(yīng)該合在一起書寫 */s_ptPendreq_list; /* 不符合規(guī)范 req應(yīng)該以大寫字母開頭 */szIedName; /* 不符合規(guī)范 */ 【規(guī)則4-12】 類的成員函數(shù)名用大寫字母開頭的一個(gè)或多個(gè)單詞組合而成,且應(yīng)當(dāng)使用“動(dòng)詞”或者“動(dòng)詞名詞”(動(dòng)賓詞組)。 說明:1) 函數(shù)名力求清晰、明了,通過函數(shù)名就能夠判斷函數(shù)的主要功能。函數(shù)名中不同意義字段之間不要用下劃線連接,而要把每個(gè)字段的首字母大寫以示區(qū)分。函數(shù)命名采用大小寫字母結(jié)合的形式,但專有名詞不受限制。2) 函數(shù)接口名稱由“函數(shù)前綴標(biāo)識(shí)”+“_”+“函數(shù)主體標(biāo)識(shí)”+“_”+“修飾
35、語標(biāo)識(shí)”組成。3) 函數(shù)前綴標(biāo)識(shí)是指函數(shù)接口所在的模塊名稱,函數(shù)前綴標(biāo)識(shí)部分首字母大寫,后面字符采用小寫的英文字符表示。4) 主體標(biāo)識(shí)部分以一個(gè)大寫字母的單詞開始,并以“_”和函數(shù)前綴標(biāo)識(shí)分開,如果函數(shù)主體標(biāo)識(shí)部分多于一個(gè)單詞,應(yīng)將幾個(gè)單詞寫到一起,后面的單詞都以大寫字母開頭。 注:縮寫的單詞按照慣例是大小寫的,整個(gè)單詞全部按照慣例書寫。示例: ST_RET Ai_var_ParseDataValues(); /* ai_var 模塊實(shí)現(xiàn)的解析數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)值接口 */ 5) 對(duì)于封裝的庫接口,可以使用庫縮寫代替函數(shù)實(shí)現(xiàn)的模塊名作為函數(shù)前綴標(biāo)識(shí),并且需要在回調(diào)函數(shù)或者擴(kuò)展函數(shù)的函數(shù)前綴標(biāo)識(shí)前添加
36、“U_”予以標(biāo)識(shí)。 示例:ST_RET Iec61850_GetDataValues(); /* ac_read 模塊實(shí)現(xiàn)的IEC61850 通訊平臺(tái)庫客戶端讀數(shù)據(jù)值接口 */ST_VOID U_iec61850_command(); /* IEC61850 通訊平臺(tái)庫在服務(wù)器端提供給應(yīng)用者的操作命令擴(kuò)展接口 */ 6) 為充分表述函數(shù)操作的限定,可以在函數(shù)主體標(biāo)識(shí)后添加修飾語標(biāo)識(shí)。示例: MVL_NET_INFO *Ac_srvm_GetNetInfo_byIEDName(); /* ac_srvm 模塊實(shí)現(xiàn)的通過裝置名稱獲取通道函數(shù)接口 */ 建議:虛函數(shù)習(xí)慣以“Do”開頭,如:DoRef
37、resh();事件處理函數(shù)習(xí)慣以單詞“On”開頭;回調(diào)函數(shù)以CallBack 開頭?!疽?guī)則4-13】 類名采用大小寫結(jié)合的方法。在構(gòu)成類名的單詞之間不用下劃線,類名在開頭加上C,后跟一個(gè)或多個(gè)單詞。為便于界定,每個(gè)單詞的首字母要大寫。類的成員變量統(tǒng)一在前面加m_ 前綴。 建議:類的命名應(yīng)當(dāng)用名詞或形容詞名詞的形式。 正例:void CMyClass:SetValue(int iWidth, int iHeight) m_iWidth = iWidth;m_iHeight = iHeight; 建議4-1 盡量避免名字中出現(xiàn)數(shù)字編號(hào),如Value1、Value2等,除非邏輯上的確需要編號(hào)。 【規(guī)
38、則4-14】 C結(jié)構(gòu)體只是一種將一組數(shù)據(jù)捆綁在一起的方式,名稱全部由大寫字母組成,單詞間使用下劃線界定。 【規(guī)則4-15】枚舉、聯(lián)合及typedef 語句都是定義新類型的簡單手段,生成的類型名由全大寫字母組成,單詞間通過下劃線來界定,如:ERROR_TYPE。枚舉值應(yīng)全部大寫,單詞間以下劃線相連。 【規(guī)則4-16】常量名由類型前綴全大寫字母組成,單詞間通過下劃線來界定,如: nMAX_BUFFER 【規(guī)則4-17】名空間的名稱不應(yīng)該過長,使用縮寫的形式來命名,言簡意賅。命名空間的名稱全小寫,命名基于項(xiàng)目/子系統(tǒng)名稱。 【規(guī)則4-18】 文件名要全部小寫,可以包含短線(-)。C+文件以.cpp結(jié)
39、尾,C文件以.c結(jié)尾。頭文件以.h結(jié)尾。 【規(guī)則4-19】若一個(gè)模塊僅由一個(gè)定義文件和頭文件組成,則頭文件和定義文件必須有相同的名字(除了擴(kuò)展名)。允許一個(gè)頭文件聲明的函數(shù)接口被不同的定義文件實(shí)現(xiàn),但不允許一個(gè)定義文件實(shí)現(xiàn)不同頭文件中聲明的函數(shù)接口。 6.5 變量、常量、宏與類型 變量、常量和數(shù)據(jù)類型是程序編寫的基礎(chǔ),它們的正確使用直接關(guān)系到程序設(shè)計(jì)的成敗,變量包括全局變量、局部變量和靜態(tài)變量,常量包括數(shù)據(jù)常量和指針常量,類型包括系統(tǒng)的數(shù)據(jù)類型和自定義數(shù)據(jù)類型。 6.5.1 變量與常量【規(guī)則5-1-1】定義全局變量時(shí)必須仔細(xì)分析,明確其含義、作用、取值范圍及與其它全局變量間的關(guān)系。說明:全局變
40、量關(guān)系到程序的結(jié)構(gòu)框架,對(duì)于全局變量的理解關(guān)系到對(duì)整個(gè)程序能否正確理解,所以在對(duì)全局變量聲明的同時(shí),應(yīng)對(duì)其含義、作用及取值范圍進(jìn)行詳細(xì)地注釋說明,若有必要還應(yīng)說明與其它變量的關(guān)系。 【規(guī)則5-1-2】明確全局變量與操作此全局變量的函數(shù)或過程的關(guān)系。 說明:全局變量與函數(shù)的關(guān)系包括:創(chuàng)建、修改及訪問。明確過程操作變量的關(guān)系后,將有利于程序的進(jìn)一步優(yōu)化、單元測試、系統(tǒng)聯(lián)調(diào)以及代碼維護(hù)等。這種關(guān)系的說明可在注釋或文檔中描述。 【規(guī)則5-1-3】一個(gè)變量有且只有一個(gè)功能,不能把一個(gè)變量用作多種用途。 說明:一個(gè)變量只用來表示一個(gè)特定功能,不能把一個(gè)變量作多種用途,即同一變量取值不同時(shí),其代表的意義也不
41、同。正例: WORD DelRelTimeQue(T_TCB *ptTcb )WORD wValue;WORD wLocate;wLocate = 3;wValue = DeleteFromQue(wLocate);return wValue;反例: WORD DelRelTimeQue(T_TCB *ptTcb) WORD wLocate; wLocate = 3; wLocate = DeleteFromQue(wLocate); / wLocate 具有兩種功能。return wLocate; 【規(guī)則5-1-4】循環(huán)語句與判斷語句中,不允許對(duì)其它變量進(jìn)行計(jì)算與賦值。 說明:循環(huán)語句只完成
42、循環(huán)控制功能,if 語句只完成邏輯判斷功能,不能完成計(jì)算賦值功能。正例:do 處理語句 cInput = GetChar(); while (cInput = 0); 反例:do 處理語句 while(cInput = GetChar();【規(guī)則5-1-5】宏定義中如果包含表達(dá)式或變量,表達(dá)式和變量必須用小括號(hào)括起來。說明:在宏定義中,對(duì)表達(dá)式和變量使用括號(hào),可以避免可能發(fā)生的計(jì)算錯(cuò)誤. 正例:#define HANDLE(A, B) ( A ) / ( B )反例:#define HANDLE(A, B) (A / B)建議5-1-1對(duì)于全局變量通過統(tǒng)一的函數(shù)訪問。說明:可以避免訪問全局變量
43、時(shí)引起的錯(cuò)誤。正例:T_Student g_tStudent; T_Student GetStudentValue(void)T_Student tStudentValue;獲取g_tStudent 的訪問權(quán)tStudentValue = g_tStudent;釋放g_tStudent 的訪問權(quán)return tStudentValue;BYTE SetStudentValue(const T_Student *ptStudentValue)BYTE ucIfSuccess;ucIfSuccess = 0; 獲取g_tStudent 的訪問權(quán)g_tStudent = *ptStudentValu
44、e ;釋放g_tStudent 的訪問權(quán)return ucIfSuccess;建議5-1-2盡量使用const 說明常量數(shù)據(jù),對(duì)于宏定義的常數(shù),必須指出其類型。正例:const int MAX_COUNT = 100;#define MAX_COUNT (int)100反例:#define MAX_COUNT 1006.5.2 宏【規(guī)則 5-2-1】用宏定義表達(dá)式時(shí),要使用完備的括號(hào)。 示例:如下定義的宏都存在一定的風(fēng)險(xiǎn)。 #define RECTANGLE_AREA( a, b ) a * b #define RECTANGLE_AREA( a, b ) (a * b)#define RECTANGLE_AREA( a, b ) (a) * (b)正確的定義應(yīng)為:#define RECTANGLE_AREA( a, b ) (a) * (b) 【規(guī)則 5-2-2】將宏所定義的多條表達(dá)式放在大括號(hào)中。 示例:下面宏定義不符合要求#define INTI_RECT_VALUE( a, b )a = 0;b = 0;正確的寫法應(yīng)為:#define INTI_RECT_VALUE( a, b ) a = 0;b = 0;【規(guī)則 5-2-3】使用宏時(shí),不允許參數(shù)發(fā)生變化。 示例:如下用法可能導(dǎo)致錯(cuò)誤。#define SQUARE( a ) (a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國安全控制系統(tǒng)行業(yè)應(yīng)用狀況及投資模式分析報(bào)告
- 2024-2030年中國嬰幼兒產(chǎn)品市場競爭力策略及投資盈利分析報(bào)告
- 2024-2030年中國大提花貢緞行業(yè)競爭格局及前景趨勢預(yù)測報(bào)告
- 2024-2030年中國臺(tái)階鏜刀行業(yè)市場發(fā)展規(guī)模及投資可行性分析報(bào)告
- 眉山藥科職業(yè)學(xué)院《國際商務(wù)談判實(shí)務(wù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年昆明住宅購買合同
- 2024年漁業(yè)供貨合同
- 主鏡頭和關(guān)系鏡頭
- 2024年度網(wǎng)絡(luò)安全防護(hù)技術(shù)支持服務(wù)合同范本3篇
- 呂梁師范高等??茖W(xué)?!妒称飞锛夹g(shù)專題》2023-2024學(xué)年第一學(xué)期期末試卷
- 八年級(jí)道法上冊(cè)第一學(xué)期期末綜合測試卷(人教版 2024年秋)
- 2025屆江蘇省期無錫市天一實(shí)驗(yàn)學(xué)校數(shù)學(xué)七年級(jí)第一學(xué)期期末達(dá)標(biāo)檢測試題含解析
- UG基礎(chǔ)培訓(xùn)課件
- 城市軌道交通運(yùn)營管理【共30張課件】
- 鋼結(jié)構(gòu)設(shè)計(jì)智慧樹知到期末考試答案章節(jié)答案2024年山東建筑大學(xué)
- 2024年廣東省廣州市荔灣區(qū)中考一模語文試題
- 人教版四年級(jí)上冊(cè)數(shù)學(xué)數(shù)學(xué)復(fù)習(xí)資料
- TD/T 1066-2021 不動(dòng)產(chǎn)登記數(shù)據(jù)庫標(biāo)準(zhǔn)(正式版)
- 睡眠中心宣傳方案
- 2024春期國開電大??啤督ㄖ茍D基礎(chǔ)》在線形考(形考性考核作業(yè)一至四)試題及答案
- 論《國際貨物銷售合同公約》的適用問題
評(píng)論
0/150
提交評(píng)論