C++语言程序设计代码规范
1 命名规范
本规范对变量、函数、类(结构)等的名称有严格的规定,在编码过程中务必遵守。
1.1 变量命名规范
变量名称采用匈牙利命名法,即:完整的名称由“缀”和“主体”复合而成。“缀”用于指示变量的种类、数值类型、作用域等属性,由小写字符和下划线(_)组成,根据其附着在“主体”的位置分为前缀和后缀两种。“主体”表示变量的语义。
整个变量名称的格式如下:
<作用域前缀>[<指针缀>]<类型缀><主体><作用域后缀>
下面详细论述。
1.1.1 作用域缀(前缀和后缀)
作用域前缀处在整个变量名的最前面。常用的作用域前缀为:
g_ | 表明这是一个全局变量。 |
m_ | 表明这是一个类成员变量。 |
s_ | 表明这是一个静态(static)变量。 |
_(前缀) | 表明这是一个局部变量。参看后面详细解释。 |
_(后缀) | 表明这是一个参数变量。参看后面详细解释。 |
作用域后缀处在整个变量名的最后面。只有一种情况使用作用域后缀,就是函数的形参必须以作用域后缀结束。
1.1.2 指针缀
如果一个变量是指针,则必须使用指针缀。指针缀使用字母p表示。
以前,在DOS平台下有短指针和长指针的区别,有时称长指针为lp。在Win32平台下已经不存在这个区别了,所以统一使用p, 而不是lp。
1.1.3 类型缀
类型缀由小写字符构成,用于描述变量的类型。注意:
1.不要私自创造出各种各样的前缀。
2.也没有必要在前缀中仔细区分一些细小的类型区别,那样会给代码维护工作带来额外的麻烦。
常用的类型前缀为:
n | 用于一般情况下的各种整数、浮点数、枚举类型,包括:(unsigned) int, (unsigned) long, 和一些派生类型:UINT, ULONG,WORD,DWORD等。 |
b | bool 类型 |
p | 表示指针,在Win32平台下使用p, 而不是lp。 |
h | Windows API内部的各种HANDLE。 |
sz | char 或者 char_w类型的数组或者字符串常量。 |
wnd | Windows窗口,所有MFC窗口对象都以wnd缀开头。包括:CView,CDialog,CFrameWnd,CButton等。 |
pt | POINT, CPoint |
clr | COLORREF,其它用来表示颜的数值类型 |
dc | CDC类 |
pen | CPen |
brush | CBrush |
vector | std::vector |
list | std::list, CList |
map | std::map, CMap |
array | CArray |
it | std::iterator |
c, w, dw | 用于要求明确区分数据类型长度的情况下,如跨平台的网络通讯,或磁盘读取。注意,尽量使用n作为前缀,而不是这些字符前缀。 |
对于其他不在上面表中的结构、类等复杂数据类型,特别是不常使用的和不通用的,不使用前缀。例如:
class Person Jonson;
struct DateTime MyDt;
在应用场合明确的情况下,例如:简单的局部变量,它的值类型前缀有时可以省略。具体见下面的例子。
1.1.4 复合前缀
根据以上规则,变量根据它所在的作用域、类型、是否是指针,得到一个复合前缀。例如:
char g_szFileName[_MAX_PATH]; //全局字符串变量
char* g_pszFileName; //全局字符串指针变量:
char s_szFileName[_MAX_PATH]; //静态字符串变量
char* s_pszFileName; //静态字符串指针变量:
char _s_szFileName[_MAX_PATH]; //局部静态字符串变量
char* _s_pszFileName; //局部静态字符串指针变量:
char m_szFileName[_MAX_PATH]; //类字符串变量
char* m_pszFileName; //类字符串指针变量:
char ms_szFileName[_MAX_PATH]; //类静态字符串变量
char* ms_pszFileName; //类静态字符串指针变量:
更多的例子,参见下面按照作用域讨论变量名一节。
1.1.5 主体
用于描述变量的上下文意义。
一般地,由首字母大写的一个或者多个单词构成,要求用英语作为描述语言。如:FileName,DateTime。这样就形成了由大小字母夹杂的单词串,这种写法常见于
Windows风格的编码。
注:全部单词小写,单词之间使用下划线分割,例如:file_name,date_time。这种写法常见于UNIX风格的编码。但是这种命名方式就不能很好地区分缀和主体,所以在本规范中是不推荐的。
单个的变量声明使用单数形式,不加任何冠词。例如:
CFile _file;
数组使用名词复数形式。
CFile _files[3];
一些容器类的作用类似于数组,所以也使用复数命名,例如:
CArray _arrayFiles;
std::list<CObject*> _listObjects;
1.2 按作用域分类讨论变量命名
1.2.1 参数变量
函数的参数变量要求由后下划线结尾(见作用域缀一节)。在一些纯数学函数中,也可省去数值类型前缀n,其它类型前缀不能省略。例如:
bool Create(PCTSTR pszPathName_);
double Add(double a_, double b_); // 值类型前缀省略
1.2.2 局部变量
由前下划线开头。在纯数学函数中,或者简短的上下文中,也可省去数值类型前缀n,其它类型前缀不能省略。
bool _bRet;
char _szBuffer[_MAX_PATH]
// 下面是一些值类型前缀省略的例子
int _i; // 常表示循环变量
int _temp;
for (int _i = 0; _i < _countof(_szBuffer); _i++)
{
float _a; // _a的作用域很短,所以可以省略
}
1.2.3 全局变量
使用作用域前缀’g_’。全局变量因为作用域很大,所以命名一定要规范。名称的主体部分必须能清晰说明变量的意义,并且不得有不规范的缩写。例如:
CWinApp g_Application;
int g_nVersion;
HINSTANCE g_hInstance;
1.2.4 静态变量
使用作用域前缀’s_’。 局部静态变量使用前缀’_s_’,注意看下面的例子。例如:
CNcWinApp s_App;
int s_nVersion;
HINSTANCE s_hInst;
void f()
{
static int _s_nCallTimes;
}
1.2.5 其他例子
下面是变量命名的一些例子:
extern HINSTANCE g_hInst; //全局变量
static int s_nTimer = 0; //全局静态变量
int func(int nCounter_, int* pnSize_) //参数变量
{
//局部变量
long _nTotalItem;
static long _s_nCount = 0;
int _nVar;
LPSTR _pszBuffer;
厉害的编程代码TCHAR _szCache[_MAX_PATH];
int _var1; // 省去类型前缀
}
1.3 常数
目前本规范对常数类的命名规范还不是非常清晰。很多常数作用域也很大,类似于全局变量,所以命名一定要规范。名称的主体部分必须能清晰说明变量的意义,并且不得有不规范的缩写。
常数分成以下几类讨论。
1.3.1 宏定义的常数
#define定义的常数要求用大写字母和下划线混合命名,但是并不强制要求在每个单词之间插入下划线。如:
#define LEFT 0 // okay
#define RIGHT 1 // okay
#define UP_DOWN 1 // okay
#define Right 1 // not recommended
1.3.2 const定义的常数
(未完成)
const常数员命名既可以遵循一般变量命名法则;也可以遵循常数命名法则;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论