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

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

下载文档原格式

  / 12
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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
{
//局部变量
long _nTotalItem;
static long_s_nCount = 0;
int _nVar;
LPSTR _pszBuffer;
TCHAR_szCache[_MAX_PATH];
int_var1;//省去类型前缀
}
1.3
目前本规范对常数类的命名规范还不是非常清晰。很多常数作用域也很大,类似于全局变量,所以命名一定要规范。名称的主体部分必须能清晰说明变量的意义,并且不得有不规范的缩写。
protected://then
int m_nVar1;
int m_nVar2;
private://last
int DoSomething();
};
2
需要注意的是,非公共接口的结构、类、常数、函数原形不要放在公共头文件中,而是应该放在私有头文件或实现文件中。
2.1
文件标头必须包括版权说明、简短介绍。下面是文件标头的一个例子:
char ms_szFileName[_MAX_PATH];//类静态字符串变量
char* ms_pszFileName;//类静态字符串指针变量:
更多的例子,参见下面按照作用域讨论变量名一节。
1.1.5
用于描述变量的上下文意义。
一般地,由首字母大写的一个或者多个单词构成,要求用英语作为描述语言。如:FileName,DateTime。这样就形成了由大小字母夹杂的单词串,这种写法常见于Windows风格的编码。
C++语言程序设计代码规范
1
本规范对变量、函数、类(结构)等的名称有严格的规定,在编码过程中务必遵守。
1.1
变量名称采用匈牙利命名法,即:完整的名称由“缀”和“主体”复合而成。“缀”用于指示变量的种类、数值类型、作用域等属性,由小写字符和下划线(_)组成,根据其附着在“主体”的位置分为前缀和后缀两种。“主体”表示变量的语义。
整个变量名称的格式如下:
<作用域前缀>[<指针缀>]<类型缀><主体><作用域后缀>
下面详细论述。
1.1.1
作用域前缀处在整个变量名的最前面。常用的作用域前缀为:
g_
表明这是一个全局变量。
m_
表明这是一个类成员变量。
s_
表明这是一个静态(static)变量。
_(前缀)
表明这是一个局部变量。参看后面详细解释。
doubleAdd(doublea_, double b_); //值类型前缀省略
1.2.2
由前下划线开头。在纯数学函数中,或者简短的上下文中,也可省去数值类型前缀n,其它类型前缀不能省略。
bool_bRet;
char _szBuffer[_MAX_PATH]
//下面是一些值类型前缀省略的例子
int _i;//常表示循环变量
CWinAppg_Application;
int g_nVersion;
HINSTANCE g_hInstance;
1.2.4
使用作用域前缀’s_’。局部静态变量使用前缀’_s_’,注意看下面的例子。例如:
CNcWinApps_App;
int s_nVersion;
HINSTANCE s_hInst;
下面是一个声明处说明的例子:
//Description:
// [You can fill some description here ]
//
//Entries:
// [Parameter1][about Parameter1]
// [Parameter2][about Parameter2]
// [Parameter3][about Parameter3]
类成员变量:遵循一般变量命名法则,同时要求使用’m_’前缀。
类成员函数:遵循一般函数命名法则;
嵌套类、枚举、嵌套结构:遵循一般类、结构命名法则;
综合以上,举一例如:
class MyClass :: public BaseClass
{
public://first
MyClass();
~MyClass();
struct DateTime
{
intdtYear;//error
intdtMonth;//error
intdtDay;//error
intdtHour;//error
intdtMinite;//error
intdtSecond;//error
};
一般说来,结构中不包含成员函数(偶尔,仅仅包含构造函数是允许的)。如果希望把结构改造成包含丰富成员函数的对象,那样的话,请使用类(class)。其命名规范见下面叙述。
注:全部单词小写,单词之间使用下划线分割,例如:file_name,date_time。这种写法常见于UNIX风格的编码。但是这种命名方式就不能很好地区分缀和主体,所以在本规范中是不推荐的。
单个的变量声明使用单数形式,不加任何冠词。例如:
CFile _file;
数组使用名词复数形式。
CFile _files[3];
int _temp;
for (int _i = 0; _i < _countof(_szBuffer); _i++)
{
float _a;//_a的作用域很短,所以可以省略
}
1.2.3
使用作用域前缀’g_’。全局变量因为作用域很大,所以命名一定要规范。名称的主体部分必须能清晰说明变量的意义,并且不得有不规范的缩写。例如:
int NetClose();
int NetSend();
int NetReceive();
内部实现函数可以使用前下划线作为前缀,例如:
class MyClass
{
// . . .
private:
void _init();
};
仅在某一个代码文件使用的内部实现函数应定义为静态函数,这可以避免作用域冲突。
一些容器类的作用类似于数组,所以也使用复数命名,例如:
CArray _arrayFiles;
std::list<CObject*> _listObjects;
1.2
1.2.1
函数的参数变量要求由后下划线结尾(见作用域缀一节)。在一些纯数学函数中,也可省去数值类型前缀n,其它类型前缀不能省略。例如:
bool Create(PCTSTR pszPathName_);
1.1.3
类型缀由小写字符构成,用于描述变量的类型。注意:
1.不要私自创造出各种各样的前缀。
2.也没有必要在前缀中仔细区分一些细小的类型区别,那样会给代码维护工作带来额外的麻烦。
常用的类型前缀为:
n
用于一般情况下的各种整数、浮点数、枚举类型,包括:(unsigned) int, (unsigned) long, 和一些派生类型:UINT, ULONG,WORD,DWORD等。
_(后缀)
表明这是一个参数变量。参看后面详细解释。
作用域后缀处在整个变量名的最后面。只有一种情况使用作用域后缀,就是函数的形参必须以作用域后缀结束。
1.1.2
如果一个变量是指针,则必须使用指针缀。指针缀使用字母p表示。
以前,在DOS平台下有短指针和长指针的区别,有时称长指针为lp。在Win32平台下已经不存在这个区别了,所以统一使用p,而不是lp。
用于要求明确区分数据类型长度的情况下,如跨平台的网络通讯,或磁盘读取。注意,尽量使用n作为前缀,而不是这些字符前缀。
对于其他不在上面表中的结构、类等复杂数据类型,特别是不常使用的和不通用的,不使用前缀。例如:
class Person Jonson;
struct DateTime MyDt;
在应用场合明确的情况下,例如:简单的局部变量,它的值类型前缀有时可以省略。具体见下面的例子。
1.5
结构命名:结构名服从一般变量命名法则。
结构成员命名:结构变量名服从一般变量命名法则。如:
struct DateTime
{
int nYear;
int nMonth;
int nDay;
int nHour;
int nMinite;
int nSecond;
};
本规范不采用对结构成员使用表示结构的前缀。如:
2.2
函数说明是可选的。可以使用中文或者英文编写。
一般说来,公开接口、公共函数应该有说明,这样便于代码维护。
函数说明有两个地方可以放,一是放在函数声明中,而是放在函数实现中。这两个地方的函数说明有所不同。
函数声明处的说明:
此处的说明目的是告诉使用者,该函数的用法以及应该注意的问题,应包括函数的作用、入口参数和返回值说明,以及需要注意的声明内容。
1.6
1.6.1
在类中,推荐先是public节的内容,然后是protected节,最后是private节。也推荐参考MFC的类布局,使用
// Construction
// Attributes
// Operations
// Overrides
// Implementation
等注释来布局。
1.6.2
int getlasterror();//全小写,不推荐
int get_last_error();//全小写,不推荐
int OpenFile();// okay
intFileOpen();//非动宾结构,不推荐
属于同一类的一组函数可以使用共同前缀来标识。如:
int NetGetErroFra Baidu bibliotek();
int NetOpen();
常数分成以下几类讨论。
1.3.1
#define定义的常数要求用大写字母和下划线混合命名,但是并不强制要求在每个单词之间插入下划线。如:
#define LEFT0// okay
#define RIGHT1// okay
#define UP_DOWN1// okay
#define Right1// not recommended
char* s_pszFileName;//静态字符串指针变量:
char _s_szFileName[_MAX_PATH];//局部静态字符串变量
char* _s_pszFileName;//局部静态字符串指针变量:
char m_szFileName[_MAX_PATH];//类字符串变量
char* m_pszFileName;//类字符串指针变量:
//Copyright (c)Naiky Company. All rights reserved.
//
//Abstract:
// <someinfo here>
///////////////////////////////////////////////////////////
#include. . .
#include. . .
#include. . .
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[] = __FILE__;
#endif
自VC6.0以来,new/delete操作增加了调试版本,对检测内存泄露非常有帮助。所以上面的代码包含这部分内容。
1.1.4
根据以上规则,变量根据它所在的作用域、类型、是否是指针,得到一个复合前缀。例如:
char g_szFileName[_MAX_PATH];//全局字符串变量
char* g_pszFileName;//全局字符串指针变量:
char s_szFileName[_MAX_PATH];//静态字符串变量
void f()
{
static int _s_nCallTimes;
}
1.2.5
下面是变量命名的一些例子:
extern HINSTANCEg_hInst;//全局变量
static int s_nTimer = 0;//全局静态变量
int func(int nCounter_, int* pnSize_)//参数变量
1.3.2
(未完成)
const常数员命名既可以遵循一般变量命名法则;也可以遵循常数命名法则;
1.3.3
(未完成)
枚举命名:枚举名服从一般变量命名法则。
枚举成员命名:枚举成员名既可以遵循一般变量命名法则;也可以遵循常数命名法则;
1.4
函数命名采用大小写夹杂的动宾结构命名。如:
int GetLastError();// okay
b
bool类型
p
表示指针,在Win32平台下使用p, 而不是lp。
h
Windows API内部的各种HANDLE。
sz
char或者 char_w类型的数组或者字符串常量。
wnd
Windows窗口,所有MFC窗口对象都以wnd缀开头。包括:CView,CDialog,CFrameWnd,CButton等。