C语言程序设计代码规范_第1页
C语言程序设计代码规范_第2页
C语言程序设计代码规范_第3页
C语言程序设计代码规范_第4页
C语言程序设计代码规范_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+语言程序设计代码规范1 命名规范本规范对变量、函数、类(结构)等的名称有严格的规定,在编码过程中务必遵守。1.1 变量命名规范变量名称采用匈牙利命名法,即:完整的名称由“缀”和“主体”复合而成。“缀”用于指示变量的种类、数值类型、作用域等属性,由小写字符和下划线(_)组成,根据其附着在“主体”的位置分为前缀和后缀两种。“主体”表示变量的语义。整个变量名称的格式如下:<作用域前缀><指针缀><类型缀><主体><作用域后缀>下面详细论述。1.1.1 作用域缀(前缀和后缀)作用域前缀处在整个变量名的最前面。常用的作用域前缀为: g_表明

2、这是一个全局变量。m_表明这是一个类成员变量。s_表明这是一个静态(static)变量。_(前缀)表明这是一个局部变量。参看后面详细解释。_(后缀)表明这是一个参数变量。参看后面详细解释。作用域后缀处在整个变量名的最后面。只有一种情况使用作用域后缀,就是函数的形参必须以作用域后缀结束。1.1.2 指针缀如果一个变量是指针,则必须使用指针缀。指针缀使用字母p表示。以前,在DOS平台下有短指针和长指针的区别,有时称长指针为lp。在Win32平台下已经不存在这个区别了,所以统一使用p, 而不是lp。1.1.3 类型缀类型缀由小写字符构成,用于描述变量的类型。注意:1. 不要私自创造出各种各样的前缀。

3、2. 也没有必要在前缀中仔细区分一些细小的类型区别,那样会给代码维护工作带来额外的麻烦。常用的类型前缀为:n用于一般情况下的各种整数、浮点数、枚举类型,包括:(unsigned) int, (unsigned) long, 和一些派生类型:UINT, ULONG,WORD,DWORD等。bbool 类型p表示指针,在Win32平台下使用p, 而不是lp。hWindows API内部的各种HANDLE。szchar 或者 char_w类型的数组或者字符串常量。wndWindows窗口,所有MFC窗口对象都以wnd缀开头。包括:CView,CDialog,CFrameWnd,CButton等。pt

4、POINT, CPointclrCOLORREF,其它用来表示颜色的数值类型dcCDC类penCPenbrushCBrushvectorstd:vectorliststd:list, CListmapstd:map, CMaparrayCArrayitstd:iteratorc, w, dw用于要求明确区分数据类型长度的情况下,如跨平台的网络通讯,或磁盘读取。注意,尽量使用n作为前缀,而不是这些字符前缀。对于其他不在上面表中的结构、类等复杂数据类型,特别是不常使用的和不通用的,不使用前缀。例如:class Person Jonson;struct DateTime MyDt;在应用场合明确的情

5、况下,例如:简单的局部变量,它的值类型前缀有时可以省略。具体见下面的例子。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_sz

6、FileName_MAX_PATH;/类字符串变量char* m_pszFileName;/类字符串指针变量:char ms_szFileName_MAX_PATH;/类静态字符串变量char* ms_pszFileName;/类静态字符串指针变量:更多的例子,参见下面按照作用域讨论变量名一节。1.1.5 主体用于描述变量的上下文意义。一般地,由首字母大写的一个或者多个单词构成,要求用英语作为描述语言。如:FileName,DateTime。这样就形成了由大小字母夹杂的单词串,这种写法常见于Windows风格的编码。注:全部单词小写,单词之间使用下划线分割,例如:file_name,date_

7、time。这种写法常见于UNIX风格的编码。但是这种命名方式就不能很好地区分缀和主体,所以在本规范中是不推荐的。单个的变量声明使用单数形式,不加任何冠词。例如:CFile _file;数组使用名词复数形式。CFile _files3;一些容器类的作用类似于数组,所以也使用复数命名,例如:CArray _arrayFiles;std:list<CObject*> _listObjects;1.2 按作用域分类讨论变量命名1.2.1 参数变量函数的参数变量要求由后下划线结尾(见作用域缀一节)。在一些纯数学函数中,也可省去数值类型前缀n,其它类型前缀不能省略。例如:bool Create

8、(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_。全局

9、变量因为作用域很大,所以命名一定要规范。名称的主体部分必须能清晰说明变量的意义,并且不得有不规范的缩写。例如: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;/全局变量stat

10、ic 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 宏定义的常数#

11、define定义的常数要求用大写字母和下划线混合命名,但是并不强制要求在每个单词之间插入下划线。如:#define LEFT0/ okay#define RIGHT1/ okay#define UP_DOWN1/ okay#define Right1/ not recommended1.3.2 const定义的常数(未完成)const常数员命名既可以遵循一般变量命名法则;也可以遵循常数命名法则;1.3.3 枚举(未完成)枚举命名:枚举名服从一般变量命名法则。枚举成员命名:枚举成员名既可以遵循一般变量命名法则;也可以遵循常数命名法则;1.4 函数命名规范函数命名采用大小写夹杂的动宾结构命名。如:

12、int GetLastError();/ okayint getlasterror();/ 全小写,不推荐int get_last_error();/全小写,不推荐int OpenFile();/ okayint FileOpen();/ 非动宾结构,不推荐属于同一类的一组函数可以使用共同前缀来标识。如:int NetGetError();int NetOpen();int NetClose();int NetSend();int NetReceive();内部实现函数可以使用前下划线作为前缀,例如:class MyClass / . . .private:void _init();仅在某一个

13、代码文件使用的内部实现函数应定义为静态函数,这可以避免作用域冲突。1.5 结构命名规范结构命名:结构名服从一般变量命名法则。结构成员命名:结构变量名服从一般变量命名法则。如:struct DateTimeint nYear;int nMonth;int nDay;int nHour;int nMinite;int nSecond;本规范不采用对结构成员使用表示结构的前缀。如:struct DateTimeint dtYear;/ errorint dtMonth; / errorint dtDay; / errorint dtHour; / errorint dtMinite; / error

14、int dtSecond; / error;一般说来,结构中不包含成员函数(偶尔,仅仅包含构造函数是允许的)。如果希望把结构改造成包含丰富成员函数的对象,那样的话,请使用类(class)。其命名规范见下面叙述。1.6 类(class)1.6.1 类布局在类中,推荐先是public节的内容,然后是protected节,最后是private节。也推荐参考MFC的类布局,使用/ Construction/ Attributes/ Operations/ Overrides/ Implementation等注释来布局。1.6.2 类成员类成员变量:遵循一般变量命名法则,同时要求使用m_前缀。类成员函数

15、:遵循一般函数命名法则;嵌套类、枚举、嵌套结构:遵循一般类、结构命名法则;综合以上,举一例如:class MyClass : public BaseClasspublic: /firstMyClass();MyClass();protected:/thenint m_nVar1;int m_nVar2;private:/lastint DoSomething();2 布局规范需要注意的是,非公共接口的结构、类、常数、函数原形不要放在公共头文件中,而是应该放在私有头文件或实现文件中。2.1 文件标头文件标头必须包括版权说明、简短介绍。下面是文件标头的一个例子:/ Copyright (c) Na

16、iky Company. All rights reserved./ Abstract:/ <some info here>/#include . . .#include . . .#include . . .#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif自VC6.0以来,new/delete操作增加了调试版本,对检测内存泄露非常有帮助。所以上面的代码包含这部分内容。2.2 函数说明函数说明是可选的。可以使用中文或者英文编写。一般说来,公开接口、公共函数应

17、该有说明,这样便于代码维护。函数说明有两个地方可以放,一是放在函数声明中,而是放在函数实现中。这两个地方的函数说明有所不同。函数声明处的说明:此处的说明目的是告诉使用者,该函数的用法以及应该注意的问题,应包括函数的作用、入口参数和返回值说明,以及需要注意的声明内容。下面是一个声明处说明的例子:/Description:/ You can fill some description here /Entries:/ Parameter1 about Parameter1/ Parameter2 about Parameter2/ Parameter3 about Parameter3/Return

18、:/ about return value/Note:/ this is an optional section 函数实现处的说明:此处的说明目的是告诉代码维护人员,该函数实现的细节以及在实现过程中需要注意的问题。以下是摘自实际代码的一个例子:/*DESCRIPTION:Get the distance from a 3d-point to a 3d-line.ALGORITHM: A line in 3D is given by the parametric vector with parameter t: / x0 + (x1 - x0) * t L = | y0 + (y1 - y0)

19、* t | -(1) z0 + (z1 - z0) * t /A given point isP = (u1, v1, w1)The distance between the point and the line is thereforer2 = (u1 - x0 - (x1 - x0)*t)2 + (v1 - y0 - (y1 - y0)*t)2 + (w1 - z0 - (z1 - z0)*t)2 -(2)To minimize the distance, take d(r2) / dt = 0 -(3)assume thata = (x1 - x0)u = (u1 - x0)b = (y

20、1 - y0)v = (v1 - y0)c = (z1 - z0)w = (w1 - z0)therefore -2a * (u - a*t) - 2b(v - b*t) - 2c(w - c*t) = 0 -(4)therefore a*u + b*v + c*wt = - -(5) a*a + b*b + c*creference to (2), getr2 = (u - a*t)2 + (v - b*t)2 + (w - c*t)2 -(6)PARAMETERS:POINT3DD point_the given pointPOINT3DD line0_, POINT3DD line1_t

21、he given lineRETURNS:the power 2 of the distance*/inline double distance2_point_line(POINT3DD point_, POINT3DD line0_, POINT3DD line1_)/ . . . 2.3 代码布局代码使用制表符缩进,制表符宽度为4。代码行宽一般不超过80列(不过,现在的显示器越来越大,阅读更加方便,所以可以考虑把代码行宽设定到100列)。超过的部分折行到下一行,折行要求缩进一个制表符。2.3.1 空格使用规范保留字后面空一格。如:for (int _i = 0; _i < 3; _i

22、+)/ okeyfor(int _i = 0; _i < 3; _i+)/ not recommendedwhile (true)/ okwhile(true)/ not recommendedif (a = b)/ okswitch (sw)/ ok双目操作符左右各空一格,括号((,),)左右不空格。如:a = b = c;/ oka=b=c;/ not recommendeda = (b = c)/ oka = (b=c)/ not recommendeda = ( b = c )/ not recommendeda = (b = (c&d)/ not recommended

23、a = b1/ oka = b 1 / not recommendedif (a = b)/ okif ( a = b )/ not recommended单目操作符不空格a+;/ ok+a;/ oka * -b;/ oka/ ok逗号、分号前面紧贴上一个字符,后面空一格。如:func(int a_, int b_, int c_)/ okfunc(int a_,int b_,int c_)/ not recommendedfunc(int a_ , int b_ , int c_)/ not recommendedfor (int _loop = 0; _loop < _MAX; _l

24、oop+)/ okfor (int _loop = 0;_loop < _MAX;_loop+)/ not recommended变量(常量)的类型、名称及其它修饰符之间使用空格,而不是制表符分开,例如:int _nVar1 = 0;/ okdouble _nVar2 = 1.0;long _nVar3 = 2;DWORD _nVar4 = 0xFFFF;const float c_nMAX_VAL = 99999.9999;int _nVar1 = 0;/ not recommendeddouble _nVar2 = 1.0;long _nVar3 = 2;DWORD _nVar4 =

25、 0xFFFF;2.3.2 指针符位置指针贴近类型,而不是变量。如:/ following lines are fine and recommended style!long* _PnVar3 = GetPointer();DWORD* _nVar4 = (DWORD*)0xFFFF;const char* _pszString = “This is a test string”;/ not recommended!long *_PnVar3 = GetPointer();DWORD *_nVar4 = (DWORD*)0xFFFF;const char *_pszString = “This is a test string”;在VC6.0环境下,我们设计了宏StandardFormat用来格式化代码。可以完成大部分格式化工作。也可以用VC+中Edit |Advanced| Tabify Selection和Edit| Advanced| Untabify Selection命令来格式化代码。下面是一些推荐布局风格:/ Ex. 1if (a = b)/some code here/ Ex. 2switch (_nSwitchVar)case 1:/some code hereint _temp = / . . .break;case 2:f(2);break;case 3:f(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论