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