C语言程序设计代码规范.doc

上传人:jian****018 文档编号:10225957 上传时间:2020-04-10 格式:DOC 页数:12 大小:135KB
返回 下载 相关 举报
C语言程序设计代码规范.doc_第1页
第1页 / 共12页
C语言程序设计代码规范.doc_第2页
第2页 / 共12页
C语言程序设计代码规范.doc_第3页
第3页 / 共12页
点击查看更多>>
资源描述
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等。bbool 类型p表示指针,在Win32平台下使用p, 而不是lp。hWindows API内部的各种HANDLE。szchar 或者 char_w类型的数组或者字符串常量。wndWindows窗口,所有MFC窗口对象都以wnd缀开头。包括:CView,CDialog,CFrameWnd,CButton等。ptPOINT, CPointclrCOLORREF,其它用来表示颜色的数值类型dcCDC类penCPenbrushCBrushvectorstd:vectorliststd:list, CListmapstd:map, CMaparrayCArrayitstd:iteratorc, 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 _files3;一些容器类的作用类似于数组,所以也使用复数命名,例如: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 LEFT0/ okay#define RIGHT1/ okay#define UP_DOWN1/ okay#define Right1/ not recommended1.3.2 const定义的常数(未完成)const常数员命名既可以遵循一般变量命名法则;也可以遵循常数命名法则;1.3.3 枚举(未完成)枚举命名:枚举名服从一般变量命名法则。枚举成员命名:枚举成员名既可以遵循一般变量命名法则;也可以遵循常数命名法则;1.4 函数命名规范函数命名采用大小写夹杂的动宾结构命名。如: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();仅在某一个代码文件使用的内部实现函数应定义为静态函数,这可以避免作用域冲突。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; / errorint dtSecond; / error;一般说来,结构中不包含成员函数(偶尔,仅仅包含构造函数是允许的)。如果希望把结构改造成包含丰富成员函数的对象,那样的话,请使用类(class)。其命名规范见下面叙述。1.6 类(class)1.6.1 类布局在类中,推荐先是public节的内容,然后是protected节,最后是private节。也推荐参考MFC的类布局,使用/ Construction/ Attributes/ Operations/ Overrides/ Implementation等注释来布局。1.6.2 类成员类成员变量:遵循一般变量命名法则,同时要求使用m_前缀。类成员函数:遵循一般函数命名法则;嵌套类、枚举、嵌套结构:遵循一般类、结构命名法则;综合以上,举一例如:class MyClass : public BaseClasspublic: /firstMyClass();MyClass();protected:/thenint m_nVar1;int m_nVar2;private:/lastint DoSomething();2 布局规范需要注意的是,非公共接口的结构、类、常数、函数原形不要放在公共头文件中,而是应该放在私有头文件或实现文件中。2.1 文件标头文件标头必须包括版权说明、简短介绍。下面是文件标头的一个例子:/ Copyright (c) Naiky Company. All rights reserved./ Abstract:/ /#include . . .#include . . .#include . . .#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif自VC6.0以来,new/delete操作增加了调试版本,对检测内存泄露非常有帮助。所以上面的代码包含这部分内容。2.2 函数说明函数说明是可选的。可以使用中文或者英文编写。一般说来,公开接口、公共函数应该有说明,这样便于代码维护。函数说明有两个地方可以放,一是放在函数声明中,而是放在函数实现中。这两个地方的函数说明有所不同。函数声明处的说明:此处的说明目的是告诉使用者,该函数的用法以及应该注意的问题,应包括函数的作用、入口参数和返回值说明,以及需要注意的声明内容。下面是一个声明处说明的例子:/Description:/ You can fill some description here /Entries:/ Parameter1 about Parameter1/ Parameter2 about Parameter2/ Parameter3 about Parameter3/Return:/ 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) * 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 = (y1 - 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_the 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+)/ 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 recommendeda = 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; _loop+)/ okfor (int _loop = 0;_loop (b) ? (a) : (b)_max(func(), 3)/ not recommended!_max(var+, 3)/ not recommended!int _a = func();_max(_a, 3)/ okey尽量使用inline函数代替函数宏。尽量使用const代替常数宏。3.4 测试代码一些测试代码要用_DEBUG包围起来。/ bad code!if (pszBuffer)ASSERT(strlen(pszBuffer) 100);/ good code#ifdef _DEBUGif (pszBuffer)ASSERT(strlen(pszBuffer) 100);#endif4 注释关于代码注释原则有两条:1、代码中注释原则上不少于代码量的20%,最低不得少于代码量的10%;2、在进行Bug维护时,功能维护单的内容必须全部出现在代码中,否则在代码最终评审时会进行相应的扣分。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 方案规范


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!