C++语言程序设计代码规范

  • 格式:doc
  • 大小:157.50 KB
  • 文档页数:12

下载文档原格式

  / 12
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++语言程序设计代码规范

1 命名规范

本规范对变量、函数、类(结构)等的名称有严格的规定,在编码过程中务必遵守。

1.1 变量命名规范

变量名称采用匈牙利命名法,即:完整的名称由“缀”和“主体”复合而成。“缀”用于指示变量的种类、数值类型、作用域等属性,由小写字符和下划线(_)组成,根据其附着在“主体”的位置分为前缀和后缀两种。“主体”表示变量的语义。

整个变量名称的格式如下:

<作用域前缀>[<指针缀>]<类型缀><主体><作用域后缀>

下面详细论述。

1.1.1 作用域缀(前缀和后缀)

作用域前缀处在整个变量名的最前面。常用的作用域前缀为:

作用域后缀处在整个变量名的最后面。只有一种情况使用作用域后缀,就是函数的形参必须以作用域后缀结束。

1.1.2 指针缀

如果一个变量是指针,则必须使用指针缀。指针缀使用字母p表示。

以前,在DOS平台下有短指针和长指针的区别,有时称长指针为lp。在Win32平台下已经不存在这个区别了,所以统一使用p, 而不是lp。

1.1.3 类型缀

类型缀由小写字符构成,用于描述变量的类型。注意:

1.不要私自创造出各种各样的前缀。

2.也没有必要在前缀中仔细区分一些细小的类型区别,那样会给代码维护工作带来额外的麻烦。

常用的类型前缀为:

对于其他不在上面表中的结构、类等复杂数据类型,特别是不常使用的和不通用的,不使用前缀。例如:

class Person Jonson;

struct DateTime MyDt;

在应用场合明确的情况下,例如:简单的局部变量,它的值类型前缀有时可以省略。具体见下面的例子。

1.1.4 复合前缀

根据以上规则,变量根据它所在的作用域、类型、是否是指针,得到一个复合前缀。例如:

char g_sz[_MAX_PATH]; //全局字符串变量

char* g_psz; //全局字符串指针变量:

char s_sz[_MAX_PATH]; //静态字符串变量

char* s_psz; //静态字符串指针变量:

char _s_sz[_MAX_PATH]; //局部静态字符串变量

char* _s_psz; //局部静态字符串指针变量:

char m_sz[_MAX_PATH]; //类字符串变量

char* m_psz; //类字符串指针变量:

char ms_sz[_MAX_PATH]; //类静态字符串变量

char* ms_psz; //类静态字符串指针变量:

更多的例子,参见下面按照作用域讨论变量名一节。

1.1.5 主体

用于描述变量的上下文意义。

一般地,由首字母大写的一个或者多个单词构成,要求用英语作为描述语言。如:,DateTime。

这样就形成了由大小字母夹杂的单词串,这种写法常见于Windows风格的编码。

注:全部单词小写,单词之间使用下划线分割,例如:,date_time。这种写法常见于UNIX风格的编码。但是这种命名方式就不能很好地区分缀和主体,所以在本规范中是不推荐的。

单个的变量声明使用单数形式,不加任何冠词。例如:

C;

数组使用名词复数形式。

C[3];

一些容器类的作用类似于数组,所以也使用复数命名,例如:

CArray _arrayFiles;

std::list _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常数员命名既可以遵循一般变量命名法则;也可以遵循常数命名法则;

1.3.3 枚举

(未完成)