c++程序設(shè)計(jì)規(guī)范_第1頁(yè)
c++程序設(shè)計(jì)規(guī)范_第2頁(yè)
c++程序設(shè)計(jì)規(guī)范_第3頁(yè)
c++程序設(shè)計(jì)規(guī)范_第4頁(yè)
c++程序設(shè)計(jì)規(guī)范_第5頁(yè)
已閱讀5頁(yè),還剩53頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、ANSIANSI C/C+C/C+程序設(shè)計(jì)規(guī)范程序設(shè)計(jì)規(guī)范 文件編號(hào): SDSI-QG-28- 01-01 起草部門(mén): 審 核 人: 批 準(zhǔn) 人: 批準(zhǔn)日期:2008 年 4 月 版本標(biāo)識(shí): 1.0 版 目目錄錄 1目的目的.3 2定義定義.3 3程序設(shè)計(jì)要求程序設(shè)計(jì)要求.3 4程序風(fēng)格定義程序風(fēng)格定義.4 4.1編程風(fēng)格.4 4.1.1書(shū)寫(xiě)風(fēng)格.4 4.1.2程序結(jié)構(gòu).4 4.1.3程序注釋.5 4.1.4聲明.6 4.1.5臨時(shí)變量.6 4.2一些規(guī)則及建議:.6 5命名規(guī)范命名規(guī)范.6 5.1詳細(xì)定義.7 5.1.1函數(shù)(Function).7 5.1.2變量命名規(guī)范.7 5.1.3常用

2、變量的規(guī)定:.8 5.2類(lèi)定義規(guī)范.8 5.2.1類(lèi)的命名.8 5.2.2類(lèi)的注釋.8 5.2.3類(lèi)的聲明.9 1 目的目的 為使整個(gè)系統(tǒng)保持統(tǒng)一和一致的編程風(fēng)格及技術(shù),提高程序代碼的規(guī)范化 程度,制定該部分的規(guī)范。這些規(guī)范可以提高編碼質(zhì)量、增強(qiáng)可讀性、提高排 錯(cuò)的容易程度、加強(qiáng)可維護(hù)性、以及提高代碼的可重用性和可移植性。 1.1 定義定義 程序塊:是整個(gè) C/C+語(yǔ)言程序中完成某一細(xì)分功能的具有相對(duì)獨(dú)立性的一 段程序,其主要內(nèi)容包括注釋、變量定義及程序正文三部分組成。 子程序塊:程序塊中的某一細(xì)分功能的程序塊稱(chēng)為子程序塊。 臨時(shí)變量:臨時(shí)變量是每次賦值的作用域較小,一般不應(yīng)超過(guò)五行程序。 臨

3、時(shí)變量的名字本身只是說(shuō)明了該變量是一個(gè)臨時(shí)的操作數(shù),不具有任何意義, 但在某一作用域內(nèi)代表不同的具體含義。 2 程序設(shè)計(jì)要求程序設(shè)計(jì)要求 一、據(jù)所確定的標(biāo)準(zhǔn)進(jìn)行程序設(shè)計(jì)。 二、模塊內(nèi)的耦合度要高,模塊間的耦合度要低。在修改一個(gè)模塊時(shí),盡量不 要對(duì)其它模塊造成影響,若影響較大,有必要重新規(guī)劃模塊。 三、每個(gè)程序模塊的行數(shù)不限,但對(duì)于程序模塊中相對(duì)獨(dú)立性較高的程序塊最 好作成函數(shù),每個(gè)函數(shù)的代碼行數(shù)原則上不超過(guò) 200 行,經(jīng)常使用的函數(shù)最好經(jīng)常使用的函數(shù)最好 做成函數(shù)庫(kù),必須保證在整個(gè)系統(tǒng)中同名的函數(shù)有相同的定義。做成函數(shù)庫(kù),必須保證在整個(gè)系統(tǒng)中同名的函數(shù)有相同的定義。 四、盡量為程序塊加上明確

4、的漢語(yǔ)注釋。對(duì)于較復(fù)雜的程序或算法需要注釋文 檔,并在程序中注明注釋文檔及在文檔中注明程序名。 3 開(kāi)發(fā)規(guī)范開(kāi)發(fā)規(guī)范 3.1 風(fēng)格規(guī)范風(fēng)格規(guī)范 3.1.1 縮進(jìn)風(fēng)格縮進(jìn)風(fēng)格 3.1.1.1概述概述 縮進(jìn)用于提高代碼的可閱讀性,縮進(jìn)通常采用 TAB 鍵來(lái)控制縮進(jìn)風(fēng)格,但為了不同 TAB 值的問(wèn)題,縮進(jìn)采用空格縮進(jìn)。在 UE 中,通常將 TAB 設(shè)置成為 2 個(gè)空格。 3.1.1.2要求描述要求描述 程序采用縮進(jìn)風(fēng)格,在需要縮進(jìn)的地方使用 2 個(gè)空格個(gè)空格進(jìn)行縮進(jìn)。 函數(shù)或過(guò)程的開(kāi)始、結(jié)構(gòu)的定義及循環(huán)、判斷等語(yǔ)句中的代碼都要采用縮進(jìn)風(fēng)格, case 語(yǔ)句下的情況處理語(yǔ)句也要遵從語(yǔ)句縮進(jìn)要求。 3.

5、1.1.3示例示例 無(wú) 3.1.2 代碼塊分隔代碼塊分隔 3.1.2.1概述概述 相對(duì)獨(dú)立的短代碼、變量定義需要分隔開(kāi),在讀代碼時(shí)可以方便的區(qū)分出獨(dú)立代碼。 3.1.2.2要求描述要求描述 在代碼之間、變量定義之后使用一行空行一行空行來(lái)分隔代碼,用于區(qū)分代碼。 3.1.2.3示例示例 if (!valid_ni(ni) . /* program code*/ repssn_ind = ssn_dataindex.repssn_index; repssn_ni = ssn_dataindex.ni; 3.1.3 長(zhǎng)語(yǔ)句分隔長(zhǎng)語(yǔ)句分隔 3.1.3.1概述概述 通常情況下屏幕長(zhǎng)度可以容納超過(guò) 80

6、例字符,但為適應(yīng)多種屏幕(如 VI) ,且一行過(guò) 長(zhǎng)大多數(shù)人心理無(wú)法承受,所以長(zhǎng)語(yǔ)句要分隔。大多數(shù)情況下建議單行代碼長(zhǎng)度不要 超過(guò) 80 個(gè)字符,通常情況下可以使用各種方法縮減單行代碼。 3.1.3.2要求描述要求描述 較長(zhǎng)的語(yǔ)句(80 字符)要分成多行書(shū)寫(xiě)分成多行書(shū)寫(xiě),長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行, 操作符放在新行之首,劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句可讀。 3.1.3.3示例示例 單條語(yǔ)句單條語(yǔ)句: perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN + STAT_SIZE_PER_FRAM * sizeof( _

7、UL ); act_task_tableframe_id * STAT_TASK_CHECK_NUMBER + index.occupied = stat_poiindex.occupied; act_task_tabletaskno.duration_true_or_false = SYS_get_sccp_statistic_state( stat_item ); report_or_not_flag = (taskno MAX_ACT_TASK_NUMBER) 循環(huán)、判斷類(lèi)循環(huán)、判斷類(lèi): if (taskno max_act_task_number) (i BufferKeywordwo

8、rd_index.word_length) i+, j+) . /* program code*/ for (i = 0, j = 0; (i first_word_length) (2)比較操作符, 賦值操作符=、 +=,算術(shù)操作符+、%,邏輯操作符 a *= 2; a = b 2; (3)!、+、-、 /* 內(nèi)容操作*與內(nèi)容之間*/ flag = !isEmpty; /* 非操作!與內(nèi)容之間*/ p = /* 地址操作 /* +,-與內(nèi)容之間*/ (4)-、.前后不加空格。 p-id = pid; /* -指針前后不加空格*/ (5) if、for、while、switch 等與后面的括號(hào)

9、間應(yīng)加空格,使 if 等關(guān)鍵字更為 突出、明顯。 if (a = b 3.2.6 注釋位置注釋位置 3.2.6.1概述概述 注釋要清晰的表明注釋的是那塊代碼,而不得采用非常規(guī)的注釋需要進(jìn)行分析才知道 注釋的那塊代碼。 3.2.6.2要求描述要求描述 注釋?xiě)?yīng)與其描述的代碼相近,對(duì)代碼的注釋?xiě)?yīng)放在其上方或右方(對(duì)單條語(yǔ)句的注釋?zhuān)?相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開(kāi)。 除非必要,不應(yīng)在代碼或表達(dá)中間插入注釋?zhuān)駝t容易使代碼可理解性變差。 3.2.6.3示例示例 /*打開(kāi)動(dòng)態(tài)鏈接庫(kù)*/ pLib = dlopen(LIBBILLSO, RTLD_LAZY); 3.2.7 變

10、量常量注釋變量常量注釋 3.2.7.1概述概述 變量常量注釋用于閱讀者可以清晰的知道此變量的用途。 3.2.7.2要求描述要求描述 對(duì)于所有有物理含義的變量、常量,如果其命名不是充分自注釋的,在聲明時(shí)都必須 加以注釋?zhuān)f(shuō)明其物理含義。變量、常量、宏的注釋?xiě)?yīng)放在其上方相鄰位置或右方。 數(shù)據(jù)結(jié)構(gòu)聲明(包括數(shù)組、結(jié)構(gòu)、類(lèi)、枚舉等),如果其命名不是充分自注釋的,必須 加以注釋。對(duì)數(shù)據(jù)結(jié)構(gòu)的注釋?xiě)?yīng)放在其上方相鄰位置,不可放在下面;對(duì)結(jié)構(gòu)中的每 個(gè)域的注釋放在此域的右方。 全局變量要有較詳細(xì)的注釋?zhuān)▽?duì)其功能、取值范圍、哪些函數(shù)或過(guò)程存取它以及 存取時(shí)注意事項(xiàng)等的說(shuō)明。 3.2.7.3示例示例 #def

11、ineALLOW_UNDEAL0/ 不允許處理 /*模塊調(diào)用執(zhí)行存儲(chǔ)過(guò)程結(jié)構(gòu)體*/ typedef struct _Proc_Exec int64proc_id;/模塊標(biāo)識(shí) har ex_sql_name20;/執(zhí)行名稱(chēng) T_Proc_Exec; 3.2.8 注釋縮進(jìn)注釋縮進(jìn) 3.2.8.1概述概述 注釋縮進(jìn)采用與注釋的代碼相同規(guī)則。 3.2.8.2要求描述要求描述 注釋與所描述內(nèi)容進(jìn)行同樣的縮排。 3.2.8.3示例示例 void example_fun( void ) /* 注釋 1 */ CodeBlock One /* 注釋 2*/ CodeBlock Two 3.2.9 注釋與空行注

12、釋與空行 3.2.9.1概述概述 為美觀(guān)注釋上要有空行。 3.2.9.2要求描述要求描述 將注釋與其上面的代碼用空行隔開(kāi)。 3.2.9.3示例示例 /* 代碼一注釋 */ program code one /* 代碼二注釋 */ program code two 3.2.10跳轉(zhuǎn)注釋跳轉(zhuǎn)注釋 3.2.10.1 概述概述 跳轉(zhuǎn)語(yǔ)句往往是程序?qū)崿F(xiàn)某一特定功能的關(guān)鍵,對(duì)于維護(hù)人員來(lái)說(shuō),良好的注釋幫助 更好的理解程序,有時(shí)甚至優(yōu)于看設(shè)計(jì)文檔。 。 3.2.10.2 要求描述要求描述 對(duì)變量的定義和分支語(yǔ)句(條件分支、循環(huán)語(yǔ)句等)必須編寫(xiě)注釋。 對(duì)于 switch 語(yǔ)句下的 case 語(yǔ)句,如果因?yàn)樘厥?/p>

13、情況需要處理完一個(gè) case 后進(jìn)入下一個(gè) case 處理,必須在該 case 語(yǔ)句處理完、下一個(gè) case 語(yǔ)句前加上明確的注釋。 3.2.10.3 示例示例 case CMD_UP: /* 注釋內(nèi)容 */ ProcessUp(); break; 3.2.11注釋語(yǔ)言注釋語(yǔ)言 3.2.11.1 概述概述 注釋語(yǔ)言不統(tǒng)一,影響程序易讀性和外觀(guān)排版,出于對(duì)維護(hù)人員的考慮,建議使用中 文,除非標(biāo)準(zhǔn)英語(yǔ)注釋 3.2.11.2 要求描述要求描述 標(biāo)準(zhǔn)英語(yǔ)或中文,盡量用中文。 3.2.11.3 示例示例 無(wú) 3.3 標(biāo)識(shí)符規(guī)范標(biāo)識(shí)符規(guī)范 3.3.1 清晰明了清晰明了 3.3.1.1概述概述 標(biāo)識(shí)符的命名

14、要清晰、明了,有明確含義,同時(shí)使用完整的單詞或大家基本可以理解 的縮寫(xiě),避免使人產(chǎn)生誤解。 3.3.1.2要求描述要求描述 較短的單詞可通過(guò)去掉“元音”形成縮寫(xiě);較長(zhǎng)的單詞可取單詞的頭幾個(gè)字母形成縮 寫(xiě);一些單詞有大家公認(rèn)的縮寫(xiě)。 對(duì)于變量命名,禁止取單個(gè)字符(如 i、j、k.) ,建議除了要有具體含義外,還能表明 其變量類(lèi)型、數(shù)據(jù)類(lèi)型等,但 i、j、k 作局部循環(huán)變量是允許的。 3.3.1.3示例示例 temp 可縮寫(xiě)為 tmp ; flag 可縮寫(xiě)為 flg ; statistic 可縮寫(xiě)為 stat ; increment 可縮寫(xiě)為 inc ; message 可縮寫(xiě)為 msg ; 3.

15、3.2 風(fēng)格風(fēng)格 3.3.2.1概述概述 命名規(guī)范必須與所使用的系統(tǒng)風(fēng)格保持一致,并在同一項(xiàng)目中統(tǒng)一。 3.3.2.2要求描述要求描述 采用 UNIX 的全小寫(xiě)加下劃線(xiàn)的風(fēng)格或大小寫(xiě)混排的方式,不要使用大小寫(xiě)與下劃線(xiàn) 混排的方式,用作特殊標(biāo)識(shí)如標(biāo)識(shí)成員變量或全局變量的 m_和 g_,其后加上大小寫(xiě) 混排的方式是允許的。 除非必要,不要用數(shù)字或較奇怪的字符來(lái)定義標(biāo)識(shí)符。 3.3.2.3示例示例 錯(cuò)誤風(fēng)格:錯(cuò)誤風(fēng)格: #define _EXAMPLE_0_TEST_ #define _EXAMPLE_1_TEST_ void set_sls00( BYTE sls ); 正確風(fēng)格:正確風(fēng)格: #d

16、efine _EXAMPLE_UNIT_TEST_ #define _EXAMPLE_ASSERT_TEST_ void set_udt_msg_sls( BYTE sls ); 3.4 過(guò)程規(guī)范過(guò)程規(guī)范 3.4.1 返回值返回值 3.4.1.1概述概述 對(duì)于函數(shù)的返回值要進(jìn)行全面的判斷,由于返回值判斷不周可能會(huì)導(dǎo)致程序出錯(cuò)但沒(méi) 有正確的報(bào)告。 3.4.1.2要求描述要求描述 對(duì)所調(diào)用函數(shù)的錯(cuò)誤返回碼要仔細(xì)、全面地處理。 3.4.1.3示例示例 無(wú) 3.4.2 過(guò)程長(zhǎng)度過(guò)程長(zhǎng)度 3.4.2.1概述概述 一個(gè)函數(shù)的代碼行是沒(méi)有限制的,但為了容易閱讀代碼長(zhǎng)度應(yīng)限制在兩屏可觀(guān)的程度, 通常情況下代碼

17、行不應(yīng)超過(guò)行。 3.4.2.2要求描述要求描述 代碼長(zhǎng)度不超過(guò)行。 3.4.2.3示例示例 無(wú) 3.4.3 一個(gè)功能一個(gè)函數(shù)一個(gè)功能一個(gè)函數(shù) 3.4.3.1概述概述 一個(gè)函數(shù)可以完成很多功能,但大多數(shù)情況下,一個(gè)函數(shù)只完成一個(gè)功能。一般通過(guò) 它做什么的句式來(lái)驗(yàn)證函數(shù)是否是有效的。如果需要它做什么和什么,通常不是個(gè)好 函數(shù)。 在比如 MAX 算法,通常情況下一個(gè)?:語(yǔ)句就可以實(shí)現(xiàn),但用函數(shù)來(lái)實(shí)現(xiàn)在后續(xù)的維 護(hù)中可以更好的進(jìn)行升級(jí)。 還有一種比較極端的情況是,一個(gè)函數(shù)實(shí)現(xiàn)了過(guò)多的功能,此函數(shù)通常不易理解。 3.4.3.2要求描述要求描述 一個(gè)函數(shù)僅完成一件功能。 3.4.3.3示例示例 錯(cuò)誤例子:

18、錯(cuò)誤例子: value = ( a b ) ? a : b ; 正確例子:正確例子: int max (int a, int b) return (a b) ? a : b); value = max (a, b); 或改為如下。 #define MAX (a, b) (a) (b) ? (a) : (b) value = MAX (a, b); 3.5 可讀性規(guī)范可讀性規(guī)范 3.5.1 運(yùn)算符優(yōu)先級(jí)運(yùn)算符優(yōu)先級(jí) 3.5.1.1概述概述 注意運(yùn)算符的優(yōu)先級(jí),并用括號(hào)明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級(jí)。 3.5.1.2要求描述要求描述 防止閱讀程序時(shí)產(chǎn)生誤解,防止因默認(rèn)的優(yōu)先級(jí)與設(shè)計(jì)思想不

19、符而導(dǎo)致程序出錯(cuò)。 3.5.1.3示例示例 word = (high 8) | low (1) if (a | b) . / program code 優(yōu)秀的例子:優(yōu)秀的例子: #define TRUNK_IDLE 0 #define TRUNK_BUSY 1 if (Trunkindex.trunk_state = TRUNK_IDLE) Trunkindex.trunk_state = TRUNK_BUSY; . / program code 3.5.3 關(guān)系緊密緊湊關(guān)系緊密緊湊 3.5.3.1概述概述 在代碼中關(guān)系聯(lián)系比較緊湊的代碼盡量寫(xiě)在一起方便閱讀者閱讀程序。 3.5.3.2要求描述

20、要求描述 源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。 3.5.3.3示例示例 錯(cuò)誤的例子:錯(cuò)誤的例子: rect.length = 10; char_poi = str; rect.width = 5; 優(yōu)秀的例子:優(yōu)秀的例子: rect.length = 10; rect.width = 5; / 矩形的長(zhǎng)與寬關(guān)系較密切,放在一起。 char_poi = str; 3.5.4 高技巧高技巧!=高可讀高可讀 3.5.4.1概述概述 程序可以寫(xiě)的非常復(fù)雜,但技巧性高的代碼并不一定是高效率的,效率一般從代碼的 算法來(lái)考慮,不要考慮從匯編角度考慮問(wèn)題。 3.5.4.2要求描述要求描述 高技巧語(yǔ)句不等于

21、高效率的程序,實(shí)際上程序的效率關(guān)鍵在于算法。 3.5.4.3示例示例 錯(cuò)誤的例子:錯(cuò)誤的例子: * stat_poi + += 1; * + stat_poi += 1; 優(yōu)秀的例子:優(yōu)秀的例子: *stat_poi += 1; stat_poi+; / 此二語(yǔ)句功能相當(dāng)于“ * stat_poi + += 1; ” + stat_poi; *stat_poi += 1; / 此二語(yǔ)句功能相當(dāng)于“ * + stat_poi += 1; ” 3.6 變量規(guī)范變量規(guī)范 3.6.1 慎用全局變量慎用全局變量 3.6.1.1概述概述 全局變量通常是萬(wàn)惡之源,如非確實(shí)必要禁止使用全局變量。 3.6.1.

22、2要求描述要求描述 如需使用全局變量須向項(xiàng)目負(fù)責(zé)人書(shū)面申請(qǐng),且在全局變量做詳細(xì)注釋?zhuān)砻鞔巳?變量的用途,使用的函數(shù),函數(shù)間的交互。 3.6.1.3示例示例 無(wú)。 3.6.2 變量初始化變量初始化 3.6.2.1概述概述 變量不初始化就使用通常會(huì)產(chǎn)生不可預(yù)料的后果。 3.6.2.2要求描述要求描述 每個(gè)變量都需要進(jìn)行初始化特別是指針變量。 3.6.2.3示例示例 無(wú)。 3.6.3 變量定義變量定義 3.6.3.1概述概述 變量的定義和主機(jī)、編譯器有比較大的關(guān)系,部分變量類(lèi)型在部分系統(tǒng)上是不支持的, 尤其要考慮位主機(jī)和位主機(jī)的關(guān)系。 3.6.3.2要求描述要求描述 變量只使用三種 INT32_

23、T,INT64_T,CHAR_T,且不要使用特別奇怪的變量前綴,比如 register 等,慎用 static 類(lèi)型。 INT32_T,INT64_T,CHAR_T 的定義在系統(tǒng)的頭文件中定義,根據(jù)不同的主機(jī)不同的編 譯器使用不同的實(shí)際定義。 3.6.3.3示例示例 #define INT32 int #define INT64 long/*位主機(jī)*/ #define INT64 long long/*32 位主機(jī)*/ 3.6.4 結(jié)構(gòu)定義結(jié)構(gòu)定義 3.6.4.1概述概述 設(shè)計(jì)結(jié)構(gòu)時(shí)應(yīng)力爭(zhēng)使結(jié)構(gòu)代表一種現(xiàn)實(shí)事務(wù)的抽象,而不是同時(shí)代表多種。結(jié)構(gòu)中的 各元素應(yīng)代表同一事務(wù)的不同側(cè)面,而不應(yīng)把描述沒(méi)

24、有關(guān)系或關(guān)系很弱的不同事務(wù)的 元素放到同一結(jié)構(gòu)中。 3.6.4.2要求描述要求描述 結(jié)構(gòu)的功能要單一,是針對(duì)一種事務(wù)的抽象,而不是一個(gè)大雜燴。 面面俱到、靈活的數(shù)據(jù)結(jié)構(gòu)反而容易引起誤解和操作困難。 3.6.4.3示例示例 錯(cuò)誤例子:錯(cuò)誤例子: typedef struct STUDENT_STRU unsigned char name8; /* students name */ unsigned char age; /* students age */ unsigned char sex; /* students sex, as follows */ /* 0 - FEMALE; 1 - MA

25、LE */ unsigned char teacher_name8; /* the student teachers name */ unisgned char teacher_sex; /* his teacher sex */ STUDENT; 正確例子:正確例子: typedef struct TEACHER_STRU unsigned char name8; /* teacher name */ unisgned char sex; /* teacher sex, as follows */ /* 0 - FEMALE; 1 - MALE */ TEACHER; typedef str

26、uct STUDENT_STRU unsigned char name8; /* students name */ unsigned char age; /* students age */ unsigned char sex; /* students sex, as follows */ /* 0 - FEMALE; 1 - MALE */ unsigned int teacher_ind; /* his teacher index */ STUDENT; 錯(cuò)誤例子:錯(cuò)誤例子: typedef struct PERSON_ONE_STRU unsigned char name8; unsig

27、ned char addr40; unsigned char sex; unsigned char city15; PERSON_ONE; typedef struct PERSON_TWO_STRU unsigned char name8; unsigned char age; unsigned char tel; PERSON_TWO; 正確例子:正確例子: typedef struct PERSON_STRU unsigned char name8; unsigned char age; unsigned char sex; unsigned char addr40; unsigned

28、char city15; unsigned char tel; PERSON; 3.6.5 結(jié)構(gòu)成員個(gè)數(shù)結(jié)構(gòu)成員個(gè)數(shù) 3.6.5.1概述概述 一個(gè)結(jié)構(gòu)體通常不要使用太多的成員,除非必要。 3.6.5.2要求描述要求描述 結(jié)構(gòu)中元素的個(gè)數(shù)應(yīng)適中。若結(jié)構(gòu)中元素個(gè)數(shù)過(guò)多可考慮依據(jù)某種原則把元素組成不 同的子結(jié)構(gòu),以減少原結(jié)構(gòu)中元素的個(gè)數(shù) 3.6.5.3示例示例 3.6.6 字節(jié)順序字節(jié)順序 3.6.6.1概述概述 3.6.6.2要求描述要求描述 當(dāng)聲明用于分布式環(huán)境或不同 CPU 間通信環(huán)境的數(shù)據(jù)結(jié)構(gòu)時(shí),必須考慮機(jī)器的字節(jié)順 序、使用的位域及字節(jié)對(duì)齊等問(wèn)題 。 3.6.6.3示例示例 比如 Inte

29、l CPU 與 68360 CPU,在處理位域及整數(shù)時(shí),其在內(nèi)存存放的“順序” 正好相反。 示例:假如有如下短整數(shù)及結(jié)構(gòu)。 unsigned short int exam; typedef struct EXAM_BIT_STRU /* Intel 68360 */ unsigned int A1: 1; /* bit 0 7 */ unsigned int A2: 1; /* bit 1 6 */ unsigned int A3: 1; /* bit 2 5 */ EXAM_BIT; 如下是 Intel CPU 生成短整數(shù)及位域的方式。 內(nèi)存: 0 1 2 . (從低到高,以字節(jié)為單位) e

30、xam exam 低字節(jié) exam 高字節(jié) 內(nèi)存: 0 bit 1 bit 2 bit . (字節(jié)的各“位” ) EXAM_BIT A1 A2 A3 如下是 68360 CPU 生成短整數(shù)及位域的方式。 內(nèi)存: 0 1 2 . (從低到高,以字節(jié)為單位) exam exam 高字節(jié) exam 低字節(jié) 內(nèi)存: 7 bit 6 bit 5 bit . (字節(jié)的各“位” ) EXAM_BIT A1 A2 A3 說(shuō)明:在對(duì)齊方式下,CPU 的運(yùn)行效率要快得多。 示例:如下圖,當(dāng)一個(gè) long 型數(shù)(如圖中 long1)在內(nèi)存中的位置正好與內(nèi)存的字 邊界對(duì)齊時(shí),CPU 存取這個(gè)數(shù)只需訪(fǎng)問(wèn)一次內(nèi)存,而當(dāng)一

31、個(gè) long 型數(shù)(如圖中的 long2)在內(nèi)存中的位置跨越了字邊界時(shí),CPU 存取這個(gè)數(shù)就需要多次訪(fǎng)問(wèn)內(nèi)存,如 i960cx 訪(fǎng)問(wèn)這樣的數(shù)需讀內(nèi)存三次(一個(gè) BYTE、一個(gè) SHORT、一個(gè) BYTE,由 CPU 的微代碼執(zhí)行,對(duì)軟件透明) ,所有對(duì)齊方式下 CPU 的運(yùn)行效率明顯快多了。 1 8 16 24 32 - - - - | long1 | long1 | long1 | long1 | - - - - | | | | long2 | - - - - | long2 | long2 | long2 | | - - - - 3.7 測(cè)試性規(guī)范測(cè)試性規(guī)范 3.7.1 調(diào)測(cè)調(diào)測(cè) 3.7.

32、1.1概述概述 3.7.1.2要求描述要求描述 在同一項(xiàng)目組或產(chǎn)品組內(nèi),要有一套統(tǒng)一的為集成測(cè)試與系統(tǒng)聯(lián)調(diào)準(zhǔn)備的調(diào)測(cè)開(kāi)關(guān)及 相應(yīng)打印函數(shù),并且要有詳細(xì)的說(shuō)明。調(diào)測(cè)打印出的信息串的格式要有統(tǒng)一的形式。 信息串中至少要有所在模塊名(或源文件名)及行號(hào)。 編程的同時(shí)要為單元測(cè)試選擇恰當(dāng)?shù)臏y(cè)試點(diǎn),并仔細(xì)構(gòu)造測(cè)試代碼、測(cè)試用例,同時(shí) 給出明確的注釋說(shuō)明。測(cè)試代碼部分應(yīng)作為(模塊中的)一個(gè)子模塊,以方便測(cè)試代 碼在模塊中的安裝與拆卸(通過(guò)調(diào)測(cè)開(kāi)關(guān)) 。 在軟件系統(tǒng)中設(shè)置與取消有關(guān)測(cè)試手段,不能對(duì)軟件實(shí)現(xiàn)的功能等產(chǎn)生影響。 用調(diào)測(cè)開(kāi)關(guān)來(lái)切換軟件的 DEBUG 版和正式版,而不要同時(shí)存在正式版本和 DEBUG

33、 版本的不同源文件,以減少維護(hù)的難度。 軟件的 DEBUG 版本和發(fā)行版本應(yīng)該統(tǒng)一維護(hù),不允許分家,并且要時(shí)刻注意保證兩 個(gè)版本在實(shí)現(xiàn)功能上的一致性。 在編寫(xiě)代碼之前,應(yīng)預(yù)先設(shè)計(jì)好程序調(diào)試與測(cè)試的方法和手段,并設(shè)計(jì)好各種調(diào)測(cè)開(kāi) 關(guān)及相應(yīng)測(cè)試代碼如打印函數(shù)等。 編寫(xiě)防錯(cuò)程序,然后在處理錯(cuò)誤之后可用斷言宣布發(fā)生錯(cuò)誤。 3.7.1.3示例示例 示例:假如某模塊收到通信鏈路上的消息,則應(yīng)對(duì)消息的合法性進(jìn)行檢查,若消息類(lèi) 別不是通信協(xié)議中規(guī)定的,則應(yīng)進(jìn)行出錯(cuò)處理,之后可用斷言報(bào)告,如下例。 #ifdef _EXAM_ASSERT_TEST_ / 若使用斷言測(cè)試 /* Notice: this funct

34、ion does not call abort to exit program */ void assert_report( char * file_name, unsigned int line_no ) printf( nEXAMError Report: %s, line %un, file_name, line_no ); #define ASSERT_REPORT( condition ) if ( condition ) / 若條件成立,則無(wú)動(dòng)作 NULL; else / 否則報(bào)告 assert_report ( _FILE_, _LINE_ ) #else / 若不使用斷言測(cè)試

35、#define ASSERT_REPORT( condition ) NULL #endif /* end of ASSERT */ int msg_handle( unsigned char msg_name, unsigned char * msg ) switch( msg_name ) case MSG_ONE: . / 消息 MSG_ONE 處理 return MSG_HANDLE_SUCCESS; . / 其它合法消息處理 default: . / 消息出錯(cuò)處理 ASSERT_REPORT( FALSE ); / “合法”消息不成立,報(bào)告 return MSG_HANDLE_ERR

36、OR; 3.7.2 斷言斷言 3.7.2.1概述概述 斷言是對(duì)某種假設(shè)條件進(jìn)行檢查(可理解為若條件成立則無(wú)動(dòng)作,否則應(yīng)報(bào)告) ,它可 以快速發(fā)現(xiàn)并定位軟件問(wèn)題,同時(shí)對(duì)系統(tǒng)錯(cuò)誤進(jìn)行自動(dòng)報(bào)警。斷言可以對(duì)在系統(tǒng)中隱藏很 深,用其它手段極難發(fā)現(xiàn)的問(wèn)題進(jìn)行定位,從而縮短軟件問(wèn)題定位時(shí)間,提高系統(tǒng)的可測(cè) 性。實(shí)際應(yīng)用時(shí),可根據(jù)具體情況靈活地設(shè)計(jì)斷言。 斷言是用來(lái)處理不應(yīng)該發(fā)生的錯(cuò)誤情況的,對(duì)于可能會(huì)發(fā)生的且必須處理的情況要寫(xiě) 防錯(cuò)程序,而不是斷言。如某模塊收到其它模塊或鏈路上的消息后,要對(duì)消息的合理性進(jìn) 行檢查,此過(guò)程為正常的錯(cuò)誤檢查,不能用斷言來(lái)實(shí)現(xiàn)。 程序運(yùn)行時(shí)所需的軟硬件環(huán)境及配置要求,不能用斷言來(lái)

37、檢查,而必須由一段專(zhuān)門(mén)代 碼處理。用斷言?xún)H可對(duì)程序開(kāi)發(fā)環(huán)境中的假設(shè)及所配置的某版本軟硬件是否具有某種功能 的假設(shè)進(jìn)行檢查。如某網(wǎng)卡是否在系統(tǒng)運(yùn)行環(huán)境中配置了,應(yīng)由程序中正式代碼來(lái)檢查; 而此網(wǎng)卡是否具有某設(shè)想的功能,則可由斷言來(lái)檢查。 對(duì)編譯器提供的功能及特性假設(shè)可用斷言檢查,原因是軟件最終產(chǎn)品(即運(yùn)行代碼或 機(jī)器碼)與編譯器已沒(méi)有任何直接關(guān)系,即軟件運(yùn)行過(guò)程中(注意不是編譯過(guò)程中)不會(huì) 也不應(yīng)該對(duì)編譯器的功能提出任何需求。 3.7.2.2要求描述要求描述 使用斷言來(lái)發(fā)現(xiàn)軟件問(wèn)題,提高代碼可測(cè)性。 用斷言來(lái)檢查程序正常運(yùn)行時(shí)不應(yīng)發(fā)生但在調(diào)測(cè)時(shí)有可能發(fā)生的非法情況。 不能用斷言來(lái)檢查最終產(chǎn)品肯定

38、會(huì)出現(xiàn)且必須處理的錯(cuò)誤情況。 用斷言確認(rèn)函數(shù)的參數(shù)。 對(duì)較復(fù)雜的斷言加上明確的注釋。 用斷言保證沒(méi)有定義的特性或功能不被使用。 用斷言對(duì)程序開(kāi)發(fā)環(huán)境(OS/Compiler/Hardware)的假設(shè)進(jìn)行檢查。 正式軟件產(chǎn)品中應(yīng)把斷言及其它調(diào)測(cè)代碼去掉(即把有關(guān)的調(diào)測(cè)開(kāi)關(guān)關(guān)掉) 。 3.7.2.3示例示例 #ifdef _EXAM_ASSERT_TEST_ / 若使用斷言測(cè)試 void exam_assert( char * file_name, unsigned int line_no ) printf( nEXAMAssert failed: %s, line %un, file_name,

39、 line_no ); abort( ); #define EXAM_ASSERT( condition ) if (condition) / 若條件成立,則無(wú)動(dòng)作 NULL; else / 否則報(bào)告 exam_assert( _FILE_, _LINE_ ) #else / 若不使用斷言測(cè)試 #define EXAM_ASSERT(condition) NULL #endif /* end of ASSERT */ 3.8 效率規(guī)范效率規(guī)范 3.8.1 寫(xiě)代碼時(shí)即注意效率寫(xiě)代碼時(shí)即注意效率 3.8.1.1概述概述 代碼效率分為全局效率、局部效率、時(shí)間效率及空間效率。全局效率是站在整個(gè)系統(tǒng) 的

40、角度上的系統(tǒng)效率;局部效率是站在模塊或函數(shù)角度上的效率;時(shí)間效率是程序處 理輸入任務(wù)所需的時(shí)間長(zhǎng)短;空間效率是程序所需內(nèi)存空間,如機(jī)器代碼空間大小、 數(shù)據(jù)空間大小、??臻g大小等。 3.8.1.2要求描述要求描述 編程時(shí)要經(jīng)常注意代碼的效率,但要在保證軟件系統(tǒng)的正確性、穩(wěn)定性、可讀性及可 測(cè)性的前提下,提高代碼效率。局部效率應(yīng)為全局效率服務(wù),不能因?yàn)樘岣呔植啃?而對(duì)全局效率造成影響。 3.8.1.3示例示例 無(wú) 3.8.2 空間效率空間效率 3.8.2.1概述概述 大部分情況下空間占用都是個(gè)主要的問(wèn)題,在系統(tǒng)內(nèi)存有限的情況下,如何縮減內(nèi)存 占用都是問(wèn)題,比如內(nèi)存是 10G,但每個(gè)進(jìn)程的空間占用

41、 1G,則表明并發(fā)處理只能啟 動(dòng) 10 個(gè)進(jìn)程。 3.8.2.2要求描述要求描述 通過(guò)對(duì)系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的劃分與組織的改進(jìn),以及對(duì)程序算法的優(yōu)化來(lái)提高空間效率。 人為的縮減變量可用值是不可取的,比如電話(huà)號(hào)碼最長(zhǎng)可以是位,但通常情況下 是位或者位,為了縮減這部分空間把電話(huà)號(hào)碼的長(zhǎng)度改為位,是不可取的, 而是通過(guò)結(jié)構(gòu)的調(diào)整來(lái)縮減空間占用,當(dāng)然動(dòng)態(tài)的內(nèi)存占用分配會(huì)減少空間占用,但 存在的問(wèn)題是效率會(huì)降低,且后期維護(hù)代碼復(fù)雜。 3.8.2.3示例示例 如下記錄學(xué)生學(xué)習(xí)成績(jī)的結(jié)構(gòu)不合理。 typedef unsigned char BYTE; typedef unsigned short WORD; typ

42、edef struct STUDENT_SCORE_STRU BYTE name8; BYTE age; BYTE sex; BYTE class; BYTE subject; float score; STUDENT_SCORE; 因?yàn)槊课粚W(xué)生都有多科學(xué)習(xí)成績(jī),故如上結(jié)構(gòu)將占用較大空間。應(yīng)如下改進(jìn)(分為兩 個(gè)結(jié)構(gòu)) ,總的存貯空間將變小,操作也變得更方便。 typedef struct STUDENT_STRU BYTE name8; BYTE age; BYTE sex; BYTE class; STUDENT; typedef struct STUDENT_SCORE_STRU WORD

43、 student_index; BYTE subject; float score; STUDENT_SCORE; 3.8.3 時(shí)間效率時(shí)間效率 3.8.3.1概述概述 時(shí)間效率的關(guān)鍵之處在于減少計(jì)算量,減少計(jì)算量大體有兩個(gè)思路,:通過(guò)調(diào)整代 碼結(jié)構(gòu)縮減計(jì)算量,這種方法在大多數(shù)情況是有效的,但提高性能比率可能不會(huì)很高。 :通過(guò)調(diào)整算法縮減計(jì)算量。 3.8.3.2要求描述要求描述 通過(guò)改進(jìn)算法提高效率。 優(yōu)化最關(guān)鍵的的應(yīng)用代碼。 優(yōu)化最占時(shí)間的關(guān)鍵代碼。 謹(jǐn)慎使用匯編代碼,大多數(shù)情況下是沒(méi)有必要使用匯編代碼,如需使用需與項(xiàng)目負(fù)責(zé) 人申請(qǐng)。 對(duì)輸入輸出部分要仔細(xì)考慮,通常在此會(huì)有效率的瓶頸。 3.

44、8.3.3示例示例 無(wú)。 3.8.4 多重循環(huán)多重循環(huán) 3.8.4.1概述概述 時(shí)間效率的關(guān)鍵之處在于減少計(jì)算量,減少計(jì)算量大體有兩個(gè)思路,:通過(guò)調(diào)整代 碼結(jié)構(gòu)縮減計(jì)算量,這種方法在大多數(shù)情況是有效的,但提高性能比率可能不會(huì)很高。 :通過(guò)調(diào)整算法縮減計(jì)算量。 3.8.4.2要求描述要求描述 在多重循環(huán)中,應(yīng)將最忙的循環(huán)放在最內(nèi)層。且盡量減少循環(huán)嵌套層次。最忙的循環(huán)放在最內(nèi)層。且盡量減少循環(huán)嵌套層次。 3.8.4.3示例示例 下面示例并不合理,但確是優(yōu)化的一個(gè)思路。 如下代碼效率不高。 for (row = 0; row 100; row+) If(arowcol)continue; for (

45、col = 0; col 5; col+) sum += arowcol; 可以改為如下方式,以提高效率。 for (col = 0; col 5; col+) If(arowcol)continue; for (row = 0; row 100; row+) sum += arowcol; 3.8.5 結(jié)構(gòu)調(diào)整結(jié)構(gòu)調(diào)整 3.8.5.1概述概述 3.8.5.2要求描述要求描述 避免循環(huán)體內(nèi)含判斷語(yǔ)句,應(yīng)將循環(huán)語(yǔ)句置于判斷語(yǔ)句的代碼塊之中。 3.8.5.3示例示例 如下代碼效率稍低。 for (ind = 0; ind MAX_RECT_NUMBER; ind+) if (data_type =

46、 RECT_AREA) area_sum += rect_areaind; else rect_length_sum += rectind.length; rect_width_sum += rectind.width; 因?yàn)榕袛嗾Z(yǔ)句與循環(huán)變量無(wú)關(guān),故可如下改進(jìn),以減少判斷次數(shù)。 if (data_type = RECT_AREA) for (ind = 0; ind MAX_RECT_NUMBER; ind+) area_sum += rect_areaind; else for (ind = 0; ind MAX_RECT_NUMBER; ind+) rect_length_sum +=

47、rectind.length; rect_width_sum += rectind.width; 3.8.6 常量預(yù)先計(jì)算常量預(yù)先計(jì)算 3.8.6.1概述概述 3.8.6.2要求描述要求描述 對(duì)于長(zhǎng)使用的計(jì)算常量可以預(yù)先定義常量計(jì)算出來(lái)。 3.8.6.3示例示例 #define PAI 3.1416 radius = circle_length / (2 * PAI); 應(yīng)如下把浮點(diǎn)除法改為浮點(diǎn)乘法。 #define PAI_RECIPROCAL (1 / 3.1416 ) / 編譯器編譯時(shí),將生成具體浮 點(diǎn)數(shù) radius = circle_length * PAI_RECIPROCAL /

48、 2; 3.8.7 避免數(shù)據(jù)庫(kù)交互避免數(shù)據(jù)庫(kù)交互 3.8.7.1概述概述 3.8.7.2要求描述要求描述 盡量避免頻繁的與數(shù)據(jù)庫(kù)交互,通常數(shù)據(jù)庫(kù)交互每秒不會(huì)超過(guò) 10000 次,每次計(jì)算都 與數(shù)據(jù)庫(kù)交互則會(huì)使計(jì)算效率低于 10000 次/秒。 通常的解決辦法是使用緩存或者使用共享內(nèi)存的方式降低數(shù)據(jù)庫(kù)交互。比如序列號(hào)的 獲取采用每 100000 次獲取一次。批價(jià)資料存放到共享內(nèi)存中,資料更新采用單獨(dú)更新 進(jìn)程。 另一種辦法是把數(shù)據(jù)庫(kù)交互部分做成一個(gè)單獨(dú)的進(jìn)程,主進(jìn)程不直接與數(shù)據(jù)庫(kù)交互, 此方法通常用于非關(guān)鍵是計(jì)算,比如日志輸出到數(shù)據(jù)庫(kù),其它需要輸入到數(shù)據(jù)庫(kù)的內(nèi) 容。 3.8.7.3示例示例 無(wú)

49、3.9 質(zhì)量規(guī)范質(zhì)量規(guī)范 3.9.1 質(zhì)量?jī)?yōu)先質(zhì)量?jī)?yōu)先 3.9.1.1概述概述 3.9.1.2要求描述要求描述 代碼質(zhì)量保證優(yōu)先原則代碼質(zhì)量保證優(yōu)先原則 (1)正確性,指程序要實(shí)現(xiàn)設(shè)計(jì)要求的功能。 (2)穩(wěn)定性、安全性,指程序穩(wěn)定、可靠、安全。 (3)可測(cè)試性,指程序要具有良好的可測(cè)試性。 (4)規(guī)范/可讀性,指程序書(shū)寫(xiě)風(fēng)格、命名規(guī)則等要符合規(guī)范。 (5)全局效率,指軟件系統(tǒng)的整體效率。 (6)局部效率,指某個(gè)模塊/子模塊/函數(shù)的本身效率。 (7)個(gè)人表達(dá)方式/個(gè)人方便性,指?jìng)€(gè)人編程習(xí)慣。 3.9.1.3示例示例 無(wú) 3.9.2 資源使用資源使用 3.9.2.1概述概述 3.9.2.2要求描述

50、要求描述 只引用屬于自己的存貯空間。 防止引用已經(jīng)釋放的內(nèi)存空間。 過(guò)程/函數(shù)中分配的內(nèi)存,在過(guò)程/函數(shù)退出之前要釋放。 過(guò)程/函數(shù)中申請(qǐng)的(為打開(kāi)文件而使用的)文件句柄,在過(guò)程/函數(shù)退出之前要關(guān)閉。 防止內(nèi)存操作越界。 3.9.2.3示例示例 無(wú) 3.9.3 邊界問(wèn)題邊界問(wèn)題 3.9.3.1概述概述 3.9.3.2要求描述要求描述 編程時(shí),要防止差 1 錯(cuò)誤。此類(lèi)錯(cuò)誤一般是由于把“=”誤寫(xiě)成“=”誤寫(xiě) 成“”等造成的,由此引起的后果,很多情況下是很?chē)?yán)重的,所以編程時(shí),一定要 在這些地方小心。當(dāng)編完程序后,應(yīng)對(duì)這些操作符進(jìn)行徹底檢查。 使用變量時(shí)要注意其邊界值的情況。 時(shí)刻注意表達(dá)式是否會(huì)上溢、下溢。 3.9.3.3示例示例 如下程序?qū)⒃斐勺兞肯乱纭?unsigned

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論