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 注释规范
待续