c++開發規範
1 命名規範
1-1 類型命名
[Standards] 遵照 帕斯卡(pascal) 命名法
(1) class
/* 抽象類,'A'打頭,如:ASharedPtr,
* 注:由於class放在命名空間中,所以類名稱中不需要再追加項目名和模塊名前綴
* 如:class AAlgorithm;
*/
class AXxxYyy;
/** 接口類,'I'打頭,如:ISharedPtr
* 如:class IAlgorithm;
*/
class IXxxYyy;
/** 普通類,'C'打頭,如:CSharedPtr,名字中有縮寫時,如"CSV",將之看做一個詞彙首字母大寫即"Csv",
* 如:class CCsvReader;
*/
class CXxxYyy;
(2) struct/union/enum
[Standards] POD對象遵循全大寫命名,並使用typedef tag…重命名,是爲了方便調試
/** 僅內部使用的POD對象
* 如:
* struct FOO_TYPE {};
*/
typedef struct tagXXX_YYY {
} XXX_YYY, *LPXXX_YYY;
[Standards] 僅內部使用POD,不允許匿名內嵌POD對象,嵌套POD對象使用"INNER"前綴,如:
typedef struct tagXXX_YYY {
struct INNER_ZZZ_KKK{};
} XXX_YYY, *LPXXX_YYY;
[Standards] 外部使用POD對象,需要加上項目名,追加模塊名;且不允許內嵌POD對象,如:
/**
* 如:PUMP-項目名,MEM-模塊名
* typedef struct tagPUMP_MEM_POD_TYPE {
* } PUMP_MEM_POD_TYPE,*LPPUMP_MEM_POD_TYPE;
*/
typedef struct tagXXX_YYY_ZZZ_KKK {
} XXX_YYY_ZZZ_KKK, *LPXXX_YYY_ZZZ_KKK;
1-2 變量命名
[Standards] 普通變量名,遵守 匈牙利命名法 規範,增加變量類型前綴。變量的名字應當使用“名詞”或者“形容詞+名詞”。
(1) 類型前綴
前綴 | 說明 |
---|---|
ch | 字符類型char |
by | 無符號字符unsigned char |
sz | char* |
s | 短整數類型short int |
w | unsigned short (WORD) |
n | 整數類型int |
dw | unsigned int (DWORD) |
l | 長整數類型long int |
ul | unsigned long |
ll | long long |
ull | unsigned long long |
b | 布爾型變量bool |
f | 單浮點型變量float |
d | 雙浮點型變量double |
ld | 長雙浮點型變量long double |
obj | class實例 |
stru | struct實例 |
un | union實例 |
em | enum實例 |
h | 句柄,文件描述符 |
pfn | 函數指針 |
str | 字符串string |
vec | std::vector |
set | std::set |
lst | std::list |
map | std::map |
stak | std::stack |
it | 迭代器 |
arr | array, 如:int arrNum[10] |
p | 指針變量,如:void * pData; int * pNum; |
pp | 二重指針 |
k | 全局/靜態常量,如:const char* kDeviceId = “NVR-DS-0294jk928”; |
(2) 作用域前綴
前綴 | 說明 |
---|---|
g_ | 全局變量 (注:google規範不建議使用非POD對象作爲全局棧上對象) |
m_ | 成員變量 |
s_ | 局部靜態變量, static |
sg_ | 靜態全局變量 |
sm_ | 靜態成員變量 |
gg_ | 進程共享 |
(3) 複合類型成員變量命名
[Standards] class 對象成員變量,必須以"m_"作爲前綴,類靜態成員則"sm_"前綴打頭,變量名稱須複合匈牙利命名法
class CTestType
{
private:
int m_nNum;
DeviceInfo m_objDevInfo;
const char* m_szIp;
};
[Standards] struct/union 對象成員以"_"爲後綴,變量名稱須複合匈牙利命名法
typedef struct tagDEVICE_INFO
{
int nNum_;
int nX_;
char * szIp_;
} DEVICE_INFO, *LPDEVICE_INFO;
1-3 接口命名
(1) 內部接口
[Standards] 遵照 帕斯卡(pascal) 命名法,應當使用"動詞"或者"動詞+名詞"(動賓詞組)的形式, 參數最找普通變量命名即可
/**
* 如:
* void GetGlobalConfig(const char * szBuf, int nNum);
*/
RetType XxxYxxZzz(...);
(1) 外部接口
[Standards] 採用類似於外部POD對象的命名方式,追加全大寫項目名,模塊名前綴
/**
* 如:
* void PUMP_CONF_GetGlobalConfig();
*/
RetType XXX_YxxZzz(...);
(3) 類對象成員函數
[Standards]
- 類成員函數應當只使用“動詞”或“動詞”+“名詞”,被省略掉的名詞就是對象本身。例如:“box->Draw();”。
- 保護成員函數:開頭應當加上一個下劃線“_”以示區別,例如:"_SetState()"
- 私有成員函數:開頭應當加上兩個下劃線“__”,例如:"__DestroyImp()"
- 虛函數:習慣以“Do”開頭,如:“DoRefresh()”, “_DoEncryption()”
- 回調和事件處理函數 :習慣以單詞“On”開頭。例如:"_OnTimer()", “OnExit()”
class CPerson
{
public:
void SetName(const char *szName, size_t dwSize);
void GetName(char *szName, size_t *dwSize);
protected:
virtual void _DoEatFood(int nNum);
private:
void __GetEmotion(int * nLevel);
void __OnSocializing(const char* szMsg);
private:
char m_szName[32];
};
2 註釋規範
待續