c++代码规范(个人)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/q8250356/article/details/102510497

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

待续

猜你喜欢

转载自blog.csdn.net/q8250356/article/details/102510497