明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

編程書寫規(guī)則

[摘要]在編寫程序的過程中,特別是在多人協(xié)作編程時(shí),規(guī)范的程序書寫格式可以提高程序的可讀性,提高編寫程序的效率,使寫出的程序具有更高的可移植性。本公司在多年的軟件開發(fā)過程中,總結(jié)了許多使程序更加清晰可讀的規(guī)...

在編寫程序的過程中,特別是在多人協(xié)作編程時(shí),規(guī)范的程序書寫格式可以提高程序的可讀性,提高編寫程序的效率,使寫出的程序具有更高的可移植性。本公司在多年的軟件開發(fā)過程中,總結(jié)了許多使程序更加清晰可讀的規(guī)則,逐步形成了自己的一套編程風(fēng)格。全面的了解和熟悉這些規(guī)則,并在實(shí)際編程中嚴(yán)格的遵守這些規(guī)則,對(duì)每一位編程人員來說都是非常重要的。
以下是在編程過程中應(yīng)該遵循的規(guī)則:
一、基本要求
1.1 文件名(不包括擴(kuò)展名)的長(zhǎng)度不超過8個(gè)字符,即盡量不用長(zhǎng)文件名。
1.2 Tab鍵一般設(shè)為8,Tab字符要存成空格。
1.3 一般來說,類、結(jié)構(gòu)、枚舉的定義,函數(shù)的聲明放在.h中,
1.4 函數(shù)、成員函數(shù)的實(shí)現(xiàn)放在.cpp中,不要把它們放在.h中。(inline函數(shù)除外)
1.5 縮格
語(yǔ)句縮進(jìn)為兩個(gè)字符。例如:
if(i == 10)
Value = 10;
1.6 列對(duì)齊
一般來說,需要對(duì)齊書寫的列都從第8n+1列開始書寫。
一個(gè)文件中需要對(duì)齊書寫的列盡量從同一列開始書寫。
1.7 局部變量盡量在要用到的地方定義,不要全部定義在文件的開頭。
1.8 在設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)時(shí)要遵守對(duì)齊原則
編譯選項(xiàng)中要選4字節(jié)靠齊,代碼書寫時(shí)要按8字節(jié)靠齊書寫。
當(dāng)有字節(jié)空出時(shí),要用Rev標(biāo)明,以便再需要空間時(shí)首先使用此空間。
例如:
struct StructA
{
BYTE A;
BYTE Rev[3];
DWORD C;
}
1.9 #include "headerfile.h"的書寫
頭文件的include要按相同的順序書寫。
在所有文件都要include的頭文件寫完后,要用#inclde hdrstop標(biāo)識(shí)出來。
例如:
a.cpp中b.cpp中
#include <windows.h>#include <windows.h>
#pragma hdrstop#pragma hdrstop
#include <stdio.h>#include <stdio.h>
#include <io.h>#include <string.h>
......
二、程序框架
這里說的程序框架,是指為了體現(xiàn)程序結(jié)構(gòu),以注釋的形式對(duì)源文件按功能進(jìn)行模塊的劃分。
具體方法:
2.1 模塊命名
模塊名應(yīng)有意義,可以明確表示模塊的功能。
如果一個(gè)模塊只是一個(gè)類的話,模塊名應(yīng)為"class 類名"。例如:class BaseWND
2.2 模塊聲明
在預(yù)處理之后列出所有定義的模塊名。
模塊名應(yīng)縮格書寫,如果模塊中還定義了子模塊,子模塊名要相對(duì)其父模塊縮格書寫。
例如:
/*(頂格書寫)
Module1 Name (縮格書寫)
Module2 Name
Child Module Name (縮格書寫)
………
………
*/
2.3 模塊的定義
在模塊的起始/結(jié)束位置以模塊名加Begin/End的方式標(biāo)明。格式如下:
// Module1 Name Begin
...... (Module1)
// Module1 Name End
2.4 cpp文件中模塊的聲明和定義必須同時(shí)寫出,而在h文件中如果模塊只是一個(gè)類時(shí),可以只寫聲明部分。
2.5 入口(Import):即模塊中使用到的其它模塊定義的函數(shù),這些函數(shù)可能被改動(dòng)。
2.6 出口(Export):即供其它模塊使用的函數(shù)。
三、注釋
3.1 注釋符號(hào)與程序代碼放在同一行時(shí),應(yīng)該用一個(gè)以上的空格和程序代碼分開。
3.2 "http://"與注釋文字之間要空一格。
3.3 使用"http://"的注釋應(yīng)該盡量列對(duì)齊書寫。
3.4 不易看懂的部分一定要注釋。
四、命名
4.1 應(yīng)該使用有具體意義的名字進(jìn)行命名,這樣可以減少注釋。
4.2 變量名和函數(shù)名一律按XxxXxx格式書寫。除循環(huán)變量外,單個(gè)字母的變量也要用大寫字母表示。
例如:MaxItems、M
4.3 循環(huán)變量可以使用單個(gè)小寫字母來命名。例如:
for(int i = 0; i < 10; i++)
Array[i] = 0;
4.4 預(yù)處理宏名字中的所有字母都應(yīng)大寫,中間可以用"_"分隔,即使用XXX_XXX格式。
常量宏、變量宏的定義都用這種方法。如常量MAX_PATH、PI
4.5 類名、結(jié)構(gòu)名、枚舉名一律按XxxXxxXXX格式書寫。
如果僅由一個(gè)單詞組成,則整個(gè)單詞大寫(XXX格式)。例如:CreateFontINFO
4.6 只有下列數(shù)據(jù)類型的變量名加前綴,其它類型不加前綴:
前綴p:指針型變量名;
前綴h:句柄型變量名;
前綴b:布爾型變量名。
4.7 類成員變量和函數(shù)不能另外加前綴。
4.8 函數(shù)的參數(shù)命名不用in/out來標(biāo)識(shí)傳入/傳出。
五、表達(dá)式
5.1 需要判斷優(yōu)先級(jí)的表達(dá)式,要用"()"來標(biāo)明不同的優(yōu)先級(jí),以便程序的閱讀。
5.2 當(dāng)表達(dá)式太長(zhǎng),一行寫不下時(shí)(超過80個(gè)字符),應(yīng)把它分為幾行書寫。
5.3 劃分表達(dá)式的基本規(guī)則如下:
在一個(gè)低優(yōu)先級(jí)的操作符后開始劃分。
把這個(gè)操作符后的放到新行上。
使新的一行相對(duì)于語(yǔ)句的第一行縮格。
如果表達(dá)式要分為3行以上,則從第3行始的每一行與第2行對(duì)齊。
例如:
Value = TheDatabase.Search(UserQuery->Criterium,
CurrentSession.Domain,
...);
5.4 劃分用小括號(hào)括起的表達(dá)式時(shí),也可以讓新行與"("后的內(nèi)容對(duì)齊書寫。例如:
Value = TheDatabase.Search(UserQuery->Criterium,
CurrentSession.Domain);
5.5 劃分賦值表達(dá)式時(shí),也可以讓新行與"="后的內(nèi)容對(duì)齊書寫。
Value = MaxNumber(Number1, Number2) -
MinNumber(Number3, Number4);
5.6 如果表達(dá)式包含函數(shù)調(diào)用,應(yīng)在盡量在函數(shù)調(diào)用以外的地方劃分它,以保證函數(shù)調(diào)用的完整性。
除非函數(shù)的調(diào)用部分很長(zhǎng),必須劃分。
例如:上例中不要按以下方式劃分
Value = MaxNumber(Number1, 
Number2) - MinNumber(Number3, Number4);
5.7 劃分條件表達(dá)式時(shí),新的一行與表達(dá)式的開始位置同列。例如:
if(Condition == Green &&
Status == Ok)
GrantClearancce();
六、 語(yǔ)句
6.1 基本規(guī)則
6.1.1 表達(dá)式中不允許出現(xiàn)連續(xù)的兩個(gè)空格。
6.1.2 在","與";"符號(hào)的左邊不能有空格,但右邊要空格。例如:
for(int i, j = 0; i > 4; i++)
Array[i][j] = 0;
6.1.3 二維算數(shù)運(yùn)算符、關(guān)系運(yùn)算符的左右要各空一格。
但如果其中一個(gè)操作數(shù)是很小的數(shù)字時(shí),不要空格。例如:
Sum = Number1 + Number2;
Sum = Number+5;
6.1.4 一維運(yùn)算符與操作數(shù)之間不要空格。例如:i++
6.1.5 間接訪問運(yùn)算符"*"和取地址運(yùn)算符"&",右邊不空格。
它們與左邊的數(shù)據(jù)類型后之間要空格。例如:
void Function(char *pString, int &Num);
Function(&Buffer, Number);
有"*"、"&"的變量定義及聲明的列對(duì)齊方式如下例所示:
int Num;
char *pStr;
int &Value;
6.1.6 “箭頭”運(yùn)算符"->"的左右都不要空格。
6.1.7 域操作符"::"的左右都不要空格。
6.1.8 數(shù)組名與其后的"["之間不要空格。例如:Array[3]
6.1.9 大括號(hào)使用規(guī)則
使用大括號(hào)"{"和"}"時(shí),把它們分別放在單獨(dú)的一行上,以提高程序的可讀性。
大括號(hào)與引用它的語(yǔ)句對(duì)齊。而大括號(hào)中的正文應(yīng)該縮格書寫。例如:
while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
6.1.10 連續(xù)書寫的語(yǔ)句不要超過10行,要在適當(dāng)?shù)牡胤娇找恍小?br>6.1.11 不同用途的語(yǔ)句之間要適當(dāng)?shù)目找恍小?br>6.1.12 占多行的語(yǔ)句前后都要空一行。
6.1.13 每次空行不要超過一行。
6.1.14 盡量把常量的定義放在一起書寫。
6.1.15 預(yù)處理部分放在源程序的開始。例如:
#include <windows.h>
6.1.16 預(yù)處理指令分為多行時(shí),每行后的"\"應(yīng)列對(duì)齊書寫。
#define GET_MAX_NUM(A, B) \
if(A > B) \
Ret = A; \
else \
Ret = B;
6.1.17 if、while、for、do-while、switch、case等語(yǔ)句的語(yǔ)句體另起一行,用大括號(hào)括起。
按大括號(hào)的使用規(guī)則書寫。
6.1.18 if、while、for語(yǔ)句中,如果語(yǔ)句體只有一條語(yǔ)句可以不加大括號(hào)。
6.1.19 語(yǔ)句體要縮格書寫。
6.1.20 語(yǔ)句關(guān)鍵字與其后的"("之間,不能有空格。
6.1.21 語(yǔ)句盡量精簡(jiǎn),可寫可不寫的部分不要寫。例如:
return (Ret); 應(yīng)寫為 return Ret;
語(yǔ)句后的表達(dá)式可以用小括號(hào)將其整個(gè)括起,也可以不寫這對(duì)小括號(hào),此時(shí)要求不寫小括號(hào)。
6.1.22 數(shù)組的定義
數(shù)組定義在一行時(shí),數(shù)組內(nèi)容與"{","}"之間要空一格。"="與"{"之間也要空一格。例如:
int Array[] = { 1, 2, 3 };
數(shù)組內(nèi)容較多需分多行書寫時(shí),第一行從"="后開始劃分,
具體內(nèi)容另起一行縮格書寫,其它行從","后開始劃分,內(nèi)容之間對(duì)齊書寫,
"{","}"占單獨(dú)的一行。例如:
char Array[][20] = 
{
"String1", "String2",
"String3", "String4"
};
6.1.23 Goto語(yǔ)句盡量少用。
6.2 for語(yǔ)句
6.2.1 在for語(yǔ)句的表達(dá)式中,分號(hào)的右邊要空一格。
6.2.2 劃分for語(yǔ)句的表達(dá)式時(shí),應(yīng)盡可能的在for語(yǔ)句中的分號(hào)位置后劃分。
6.2.3 劃分for 語(yǔ)句的時(shí)候,如果只有第二個(gè)表達(dá)式很長(zhǎng),可以只劃分二個(gè)表達(dá)式,將語(yǔ)句寫成兩行。例如:
for(i = 0; i < ARRAYSIZE && Status == Ok && 
ResourceLever > MinResourcelLevel; i++)
Array[i] = i;
6.3 do-while語(yǔ)句
6.3.1 do-while語(yǔ)句中,左括號(hào)"{"單獨(dú)占一行,而右括號(hào)"}"應(yīng)與while條件語(yǔ)句在同一行上。
6.3.2 "while"與前面的"}"之間,必須空一格。
例如:
do
{
Value++;
} while(i < 10);
6.4 switch語(yǔ)句
6.4.1 "case"與其后的值之間,必須有一個(gè)空格,值與":"之間不能有空格。
6.4.2 case語(yǔ)句相對(duì)于switch要縮格。case語(yǔ)句體相對(duì)于case要縮格。
6.4.3 case語(yǔ)句體如果很簡(jiǎn)單,可以不使用大括號(hào)。例如:
switch(Month)
{
case 1:
case 2:
{
Value = 5;
...
break;
}
case 12:
Value = 7;
break;
default:
{
...
}
}
七、函數(shù)
7.1 一個(gè)函數(shù)不要過大,如果函數(shù)太大,盡量把其按功能劃分為幾個(gè)小函數(shù)。
7.2 具有類似功能的函數(shù)要放在一起書寫,可以把它們作為一個(gè)模塊。
7.3 函數(shù)之間要空一行。
7.4 函數(shù)的返回類型與函數(shù)名寫在同一行。
7.5 函數(shù)名與其后的"("之間不能空格。
7.6 函數(shù)定義中,參數(shù)的類型說明在參數(shù)表中完成。
7.7 函數(shù)參數(shù)表中,各參數(shù)之間的逗號(hào)后要空一格。
7.8 函數(shù)參數(shù)表中的指針,如果只用于傳入時(shí),一定要加const。
7.9 函數(shù)定義中,語(yǔ)句體要另起一行,用大括號(hào)括起。
7.10 語(yǔ)句體要縮格書寫。
7.11 函數(shù)定義中,如果語(yǔ)句體為空或者為單個(gè)簡(jiǎn)單語(yǔ)句,可將語(yǔ)句體與函數(shù)名放在同一行,"{"前要空一格,語(yǔ)句體前后也要空一格。如果語(yǔ)句體為空,"{"和"}"之間不空格。
7.12 在定義或調(diào)用一個(gè)函數(shù)時(shí),如果參數(shù)很長(zhǎng),可以在一個(gè)參數(shù)之后劃分它。
7.13 劃分函數(shù)的參數(shù)時(shí),不要把某個(gè)參數(shù)的類型和標(biāo)識(shí)符分開放在不同行上。
7.14 劃分函數(shù)的參數(shù)時(shí),另起的一行從函數(shù)定義的第一個(gè)參數(shù)所在列開始,或縮格書寫。例如:
BOOL CALLBACK DialogProc(HWND hDlg, UINT Msg, 
WPARAM WParam, LPARAM LParam);
BOOL CALLBACK DialogProc(HWND hDlg, UINT Msg,
WPARAM WParam, LPARAM LParam);
7.15 劃分函數(shù)時(shí),也可以將整個(gè)參數(shù)表另起一行,新行與函數(shù)的起始位置對(duì)齊。
BOOL CALLBACK DialogProc
(HWND hDlg, UINT Msg, WPARAM WParam, LPARAM LParam);
八、類和結(jié)構(gòu)
8.1 類和結(jié)構(gòu)的定義中,語(yǔ)句體要另起一行,用大括號(hào)括起。
8.2 語(yǔ)句體要縮格書寫。
8.3 類名和基類之間的":"左右都要空一格。
8.4 類和結(jié)構(gòu)的定義中,成員及成員函數(shù)名要對(duì)齊書寫。
8.5 類和結(jié)構(gòu)的定義中,private,public,protected關(guān)鍵字單獨(dú)占一行,并且不要縮格。
例如:
class ExamplePOS : public BasePOS
{
private:
double X;
double Y;
public:
init(double Xc = 0.0, double Yc = 0.0);
char *Display();
double GetSum() { return X + Y; }
};
8.6 能不寫struct,class關(guān)鍵字的地方就不寫,例如:
class MyCLASS Test; 應(yīng)寫為 MyCLASS Test;
8.7 ":"左右各空一格,如果要?jiǎng)澐直磉_(dá)式,應(yīng)從":"后開始劃分,并縮格書寫。例如:
MyCLALL::Func(int A, int B) :
BaseFunc(int A, int B)
{
...
}



標(biāo)簽:編程書寫規(guī)則