C++编码规范Ver11.doc

上传人:本田雅阁 文档编号:2508299 上传时间:2019-04-04 格式:DOC 页数:17 大小:271.52KB
返回 下载 相关 举报
C++编码规范Ver11.doc_第1页
第1页 / 共17页
C++编码规范Ver11.doc_第2页
第2页 / 共17页
C++编码规范Ver11.doc_第3页
第3页 / 共17页
C++编码规范Ver11.doc_第4页
第4页 / 共17页
C++编码规范Ver11.doc_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《C++编码规范Ver11.doc》由会员分享,可在线阅读,更多相关《C++编码规范Ver11.doc(17页珍藏版)》请在三一文库上搜索。

1、 文件编号:CEG011-1C+编码规范(Ver1.1)沈阳东软软件股份有限公司国际合作事业部文件修改控制修改记录编号修改状态修改页码及条款修改人审核人批准人修改日期1A3、变量命名规范,增加“静态变量作用域”范围前缀张军刘德启张进2002.4.182A3、变量命名规范,增加“short”类型前缀张军刘德启张进2002.4.183M四、函数编写规范,修改缩进规则张军刘德启张进2002.4.184M3、变量命名规范,在“当变量作为函数参数使用时,必须如下使用范围前缀”中将“必须”改为“建议”。张军刘德启张进2002.4.185A在变量类型前缀的附注中增加“2、除以上规定外,WIN32变量的类型前

2、缀的命名请尽量与微软的命名风格一致。”张军刘德启张进2002.4.186M在实例命名规范的示例中修改UN_MAP_INFO *m_pNextMapInfo; ST_LINK_LIST g_CurrentLinkList;为UN_MAP_INFO *m_punNextMapInfo; ST_LINK_LIST g_stCurrentLinkList;张军刘德启张进2002.4.18目 录一、命名规范41、一般规范42、文件命名规范43、变量命名规范44、实例命名规范55、函数数命名规范66、类命名规范77、其他命名规范77.1、常量77.2、联合体77.3、结构体77.4、宏77.5、枚举8二、

3、注释规范81、一般规范82、常量、变量和宏的注释83、结构体和联合体的注释94、函数的注释95、文件头部注释106、语句注释11三、文件编写规范11四、函数编写规范121、函数划分122、函数缩进123、其他13五、变量和常量使用规范14六、其他类型的使用规范14七、类的编写规范15八、可移植性规范15九、其他规范17术语说明:必须:解释为必须严格遵循的要求。 最好:解释为建议遵循的要求。可以:解释为可以选择遵循的要求。 禁止:解释为必须严格禁止遵循的要求。一、命名规范1、一般规范 C+命名规范包括文件命名规范和标识命名规范。 标识是指C+语言中语法对象的名字, 包括常量名、变量名、函数名、类

4、和类型名及预处理名等, 标识名的基本语法必须是以字母开始,由字母、数字及下划线组成的单词。 标识名最好分为两部分: 标识前缀+含义标识。 标识前缀必须由1个或多个不超过3个字母的缩写词组成。在有些情况下标识名中可以不含标识前缀。 含义标识按其应用的含义可以由一个或多个词组成. 含义标识中的词最好不缩写, 除非这种缩写比较通用, 禁止在同一系统中对同一单词使用不同的表示法(如全写和缩写均使用). 缩写词在书写时最好全部大写.2、文件命名规范 文件名必须由前缀和后缀组成,最好采用长文件命名格式。 文件名必须用英文字母表达,禁止使用中文。 对于几个单词组合表达的文件名,每个单词第一个字母必须大写。

5、源文件后缀格式可以为.cpp或.cxx,头文件后缀格式可以为:.h,.hxx。例:ScreenCapturer.h,H263Encoder.cpp 每一个类最好都有一个头文件和源文件,头文件和源文件的前缀必须与类名相对应。例:类CBufferControl对应BufferControl.h,BufferControl.cpp 类CVideoFrame对应VideoFrame.h,VideoFrame.cpp 3、变量命名规范 变量命名格式必须是:变量名= + + 。 范围前缀 类型前缀 含义标识 范围前缀的取名必须遵照下表:前缀类型例子g_全局作用域g_Serversm_成员变量m_pDoc,

6、l_局部作用域l_strNames_静态变量作用域s_strName注:局部作用域前缀可以省略不用 类型前缀的取名必须遵照下表:前缀类型描述例子chchar8-bit characterchGradechTCHAR16-bit character if _UNICODE is definedchNamebBOOLBoolean valuebEnablednintInteger (size dependent on operating system)nLengthnUINTUnsigned value (size dependent on operating system)nLengthssho

7、rt16-bit IntegersLengthwWORD16-bit unsigned valuewPoslLONG32-bit signed integerlOffsetdwDWORD32-bit unsigned integerdwRangep*Ambient memory model pointerpDoclpFAR*Far pointerlpDoclpszLPSTR32-bit pointer to character stringlpszNamelpszLPCSTR32-bit pointer to constant character stringlpszNamelpszLPCTS

8、TR32-bit pointer to constant character string if _UNICODE is definedlpszNamehhandleHandle to Windows objecthWndlpfn(*fn)()callbackFar pointer to CALLBACK functionlpfnAbortffloatfloat VariablefSpeedRateddoubledouble VariabledSpeedRateststruct struct VariablestParaInfoununionunion VariableunWeekDayfpF

9、ILE*file pointerfpTimecconstconst VariableType VariablecnVariablesz char *null-terminated stringszVariablepv void *Pointer to void typepvVariable注:1、当变量作为函数参数使用时,建议如下使用范围前缀: i _:输入参数 o_:输出参数 io_:输入输出参数例:void CHash:Compute(int* io_pnData,int i_nLen,int* o_pnRet);2、除以上规定外,WIN32变量的类型前缀的命名请尽量与微软的命名风格一致。

10、4、实例命名规范 这里的实例主要指类、结构体和联合体的实例。 实例命名格式必须为:范围前缀+p+辅助信息+含义标识其中,范围前缀同变量的范围前缀,辅助信息主要说明实例的一些具体信息,含义标识指对应类、结构体或联合体的含义标识或其缩写,若实例为指针形式必须加p。例: CH263Encoder *m_pH263Encoder; CConfigDlg g_NewConfigDlg;UN_MAP_INFO *m_punNextMapInfo; ST_LINK_LIST g_stCurrentLinkList; 常用Windows对象名称缩写Windows对象例子变量MFC类例子对象WNDhWnd;CW

11、nd*pWnd; HDLGhDlg;CDialog*pDlg; HDChDC;CDC*pDC; HGDIOBJhGdiObj;CGdiObject*pGdiObj; HPENhPen;CPen*pPen; HBRUSHhBrush;CBrush*pBrush; HFONThFont;CFont*pFont; HBITMAPhBitmap;CBitmap*pBitmap; HPALETTEhPalette;CPalette*pPalette; HRGNhRgn;CRgn*pRgn; HMENUhMenu;CMenu*pMenu; HWNDhCtl;CStatic*pStatic; CButton

12、*pBtn; CEdit*pEdit; CListBox*pListBox; CComboBox*pComboBox实际使用时必须加进范围前缀和辅助信息等。例: HWND g_hMainWnd, g_hChildWnd; CBitmap * m_pOldBitmap; CBitmap * m_pNewBitmap;5、函数数命名规范 类成员函数命名规则最好是:函数名=函数的含义标识 其他函数命名规则最好是:函数名=范围前缀_+函数返回值类型+函数的含义标识 函数名的范围前缀可以用来表明函数所属的模块类别。例: ui_nShowErrorMsg(), ui表明该函数属于界面模块。 函数的含义标识

13、必须能反映函数实现的功能。 函数的含义标识中第一个字母必须大写。 对于几个单词组合表达的函数的含义标识,每个单词第一个字母必须大写。例1:CheckForErrors()优于ErrorCheck(), DumpDataToFile()优于DataFile().例2:IsHitRetryLimit(), RetryMax(), RetryCnt()等函数名切实反映了其实现的功能6、类命名规范 类名中第一个字母必须为大写“C”。 对于几个单词组合表达的类名,每个单词第一个字母必须大写。例:用CTransmitter而不用Transmitter。 在类名中最好通过使用前缀来防止类名冲突,前缀可以由2

14、个或2个以上的唯一字符组成,前缀必须放在大写字母“C”后。例:class CICDLinkList ; class CAPNLinkList ;7、其他命名规范7.1、常量 常量名中所有字母必须大写,单词间必须用“_”相隔。例:const int A_GLOBAL_CONSTANT= 5;7.2、联合体 联合体类型命名的规则必须是:联合体名=UN_+含义标识。 联合体含义标识中所有字母必须大写,单词间必须用“_”相隔。7.3、结构体 结构体类型命名的规则必须是: 结构体名=ST_+含义标识。 结构体含义标识中所有字母必须大写,单词间必须用“_”相隔。7.4、宏 所有字母必须大写,单词间必须用“

15、_”相隔。 例:define ENCODING_TIME_TESTING7.5、枚举 枚举名必须加前缀EN_且枚举名中所有字母必须大写,单词间必须用“_”相隔。 枚举的成员变量所有字母必须大写,单词间必须用“_”相隔 例: enum EN_PIN_STATEPIN_OFF, PIN_ON; enum STATE_ERR, STATE_OPEN, STATE_RUNNING, STATE_DYING;二、注释规范1、一般规范 注释的目的必须是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,禁止没必要的重复注释信息。 注释必须语言简炼、易懂而又准确, 所采用的语种必须按“日

16、文-英文-中文”从高到低的优先级顺序进行选择。 单行注释必须用双斜杠进行注释,多行注释必须用/* */进行注释,注释内容最好放在对应代码的上方。 注释与前面的执行语句之间必须空一行。 必须边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。 注释行数(不包括程序头和函数头说明部分)必须占总行数的 1/5 到 1/3 。2、常量、变量和宏的注释 在常量、变量(临时变量除外)和宏的声明前必须对其作适当注释, 注释说明的要点是:被保存值的含义(必须)合法取值的范围(可选)与其它数据,函数或模块的关系(可选)例:/ default quantilizer level,from 1 t

17、o 31. const int DEFAULT_QL=8/ number of gob,12 for CIF and 3 for QCIF .int nGob;3、结构体和联合体的注释 对结构体或联合体的注释要点必须是:它描述的对象是什么(必须) 对其分量应按变量注释要求加以注释(必须)与其它数据, 函数或模块的关系(可选) 例:/3D Point( nPosX , nPosY , nPosZ )typedef struct ST_ THREED_ PT_TAG int nPosX; /x Positionint nPosY; /y Positionint nPosZ; /z Position

18、 ST_THREED_ PT;4、函数的注释 对于比较重要的函数或方法必须在其声明处作适当注释, 说明该函数的功能及各参数的含义,注释模版如下:/ Get data pointer of sub image short* GetSubImageData (int i_nLeft, / Left position of sub image . int i_nTop, / Top position of sub image . WORD i_wWidth, / Width of sub image . WORD i_wHeight); / Height of sub image . 对于自行编写的

19、函数,若是系统关键函数,必须在函数实现部分的上方标明该函数的信息,格式如下:(中文版)/* 函数名 :* 功能描述 :* 返回值 :* 参数 :(名称,含义,取值说明)* 作者 :* 时间 :* 修改记录 :(修改序号,修改记录,时间,修改人员)*/(将函数的简单描述放在这里)(英文版) /* Function Name :* Description :* Return Value :* Parameters :(Name,Description,Value)* Author :* Date :* Change log :(ID, Date,Author ,Description )*/(He

20、re is the Tip)注:1、在修改记录栏必须按时间先后顺序自下往上排列。2、注释文本每行的跨度禁止超过上下条纹框的范围,换行时必须以冒号 所在位置为准进行左对齐。 例:/* Function Name : CBufferList:AllocateMemory* Description : Allocate a memory block and store its address to BufferList.* Return type : void* * Argument : int nNumberofByte :Byte numbers of memory block. BOOL bL

21、ogFlag :If true,then write log file. * Author : Tom()* Date : 2001-9-27* Change log : $ Revision 1.2, 2001-12-15,Robert(robert ) Modified to be suitable to the new coding rules $ Revision 1.1, 2001-10-07,Tom() Replace the Classs-CListItem with new struct-ST_ITEM*/5、文件头部注释在文件头部必须加注释表明该文件的一些信息,其格式如下:(

22、中文版)/* (版权所有, 东软股份国际合作事业部,200X- 200X)* 文件名 :* 版本 : * 功能描述 : * 创建日期 : * 作者 : * 修改记录 : (序号,修改说明,日期,修改人)*/(英文版)/* (Copyright (c) 200X- 200X ICD Neusoft Co.,Ltd.,)* File Name:* Version Number:* Description: * Date: * Author: * Change log:( ID, Date,Author, Description,)*/注:必须在版本栏中保留以前的信息,格式如:1.0/0.8/0.7

23、。在修改记录栏必须按时间先后顺序自下往上排列。修改记录中必须特别注明修改了哪些函数。注释文本每行的跨度禁止超过上下条纹框的范围,换行时必须以冒号所在位置为准进行左对齐。例:/* (Copyright (c) 2001- 2002 ICD Neusoft Co.,Ltd.,)* File Name : BufferList.cpp* Version Number : 2.0/1.0* Description : Source file for CBufferList. To allocate and free memory block safely.* Author : Tom()* Date

24、: 2001-9-27* Change log : $ Revision 2.1, 2001-12-15,Robert(robert ) Modified to be suitable to the new coding rules in all functions. $ Revision 1.1, 2001-10-07,Tom() Replace the CListItem with new struct-ST_ITEM in SetLogOn().*/6、语句注释 对语句的注释必须放在其上方相邻位置,不要放在下面。 在程序块的结束行右方最好加注释标记,以表明某程序块的结束。 过长的函数实现

25、,最好将其语句按实现的功能分段加以概括性说明. 必须对不易理解的分枝条件表达式加注释.三、文件编写规范 头文件的构成:1、头文件的头部注释2、防止重复包含的宏:#ifndef _文件名_扩展名#define _文件名_扩展名3、包含文件部分(系统头文件、项目头文件、本地头文件)(可选)4、宏定义部分(可选)5、类型定义部分(可选)6、结构体定义部分(可选)7、函数或类的声明部分8、防止重复包含的宏:#endif 源文件的构成:1、源文件的头部注释2、包含文件部分(系统头文件、项目头文件、本地头文件)(可选)3、宏定义部分(可选)4、类型定义部分(可选)5、结构体定义部分(可选)6、函数或类的定

26、义部分注:包含文件时禁止使用绝对路径。四、函数编写规范1、函数划分 良好的函数划分,必须能够自顶向下逐级抽象地展现设计思想, 提高程序的易读性和自说明性。 函数必须是按功能划分的, 每个函数必须只做一件事情(高内聚准则)。 相关的一组函数之间的关联必须尽可能少(低耦合准则)。 在不破坏高内聚准则和低耦合准则前提下, 一个函数代码长度最好不超过100行。2、函数缩进 必须以4个空格键来表示一个缩进单位。 在不影响展示程序结构的前提下最好尽可能地减少缩进的层次. 可以使用如下两种缩进风格: (以if为例)(1)if ( expression ) statements /缩进四格 else stat

27、ements /缩进四格(2)if ( expression ) statements /缩进四格 else statements /缩进四格 在出现缩进限制时,最好遵循如下表示规范:(1) 过长的条件表达式(以if举例):if (expression1 & (expression2 /缩进四格 | expression3) /缩进八格 & expression4 ) /缩进四格 statements /缩进四格(2) 过长的函数原型说明:OBcObject * OB_DLLPASFUNC FunctionName ( /缩进四格 Type1 Parameter1, / the paramte

28、r means is written here /缩进八格 Type2 Parameter2, / . /缩进八格 . ); /缩进四格(3) 过长的函数调用:OBcObject *pObject = FunctionName /缩进四格 ( /缩进八格 parameter1, parameter2, . ); if ( FunctionName ( /缩进八格 parameter1, parameter2, . ) = 0 & expression. ) /缩进四格 3、其他 函数的输入参数和输出参数必须少于5个,当参数过多时,可以考虑将参数定义为一个结构体,并且将结构体指针作为参数。 禁止

29、将函数的参数作为工作变量。(将函数的参数作为工作变量,有可能错误地改变参数内容。对必须改变的参数,最好先用局部变量代替之,最后再将该局部变量的内容赋给该参数。) 对于超过3句以上的语句反复调用,最好封装为函数调用。 提供给外部使用的函数,禁止使用全局变量交换数据。五、变量和常量使用规范 不要将全部变量的声明放在函数开始处,变量必须在离其第一次使用的位置最近的地方声明。 最好不使用全局变量。 定义变量时要注意区分其有无符号,无符号的变量必须加上unsigned。 必须尽量使用整型变量代替浮点型变量。 禁止对浮点型变量进行相等比较。 所有变量必须在使用前进行初始化。 最好不使用malloc(),

30、calloc()和realloc()而使用new来为变量分配空间。 定义常量必须用const 或 enum,禁止使用#define。 最好用声明的常量代替代码中的经常出现的数字。 必须将常量定义在尽可能小的范围内。例: const unsigned int MAX_FOOS = 1000; const unsigned int MAX_FOO_BUFFERS = 40; class foo public: enum MAX_INSTANCES = 1000; . private: enum MAX_FOO_BUFFERS = 40; . ;六、其他类型的使用规范 禁止在结构体和联合体中定义成员

31、函数。 禁止使用预定义宏来实现函数的功能,如果想提高函数调用的速度,可以将其定义为内联函数(inline关键字)七、类的编写规范 在类中最好避免定义public 和protected 型成员变量,可以用public或protected 型的成员函数GetXXX()和SetXXX()来代替。 最好将类中的一些简单函数(如取成员变量值的函数,激活其他函数的函数)定义成内联函数。 最好不要将函数的定义放在类中。 必须将类中不影响该类成员变量值的成员函数定义为常函数类型(使用const关键字)。 禁止在类的构造函数和析构函数中使用全局的对象或变量。八、可移植性规范 最好将平台相关的代码统一放在一个文件

32、里。 最好利用typedef声明预定义的数据类型,避免直接使用预定义的数据类型。 必须注意数据类型长度的平台相关性,如int类型在不同的环境下有16位和32位之分。 必须注意int, long, short, float, double 等数据类型在不同的环境下字节的排列顺序不同。 最好使用预编译头:如果您的代码可以在多个操作系统及多个编译程序中共享, 一个预编译头文件是必不可少的, 该文件用来标识当前所用的操作系统、编译程序、CPU类型下的本地特征,如下以MS-DOS,WIN16,WIN32,Solaris2.x,HPUX,IRIS操作系统、Borland C+ 2.0以上,Microsof

33、t C/C+ 7.0以上, AT&T C+2.0以上UNIX编译器和INTEL,HP,SGI,SPARC机为平台的源码级共享所需的预编译头.#ifndef _compmacr_h#define _compmacr_h / begin the file COMPMACR.H 94.12.11#ifndef _cplusplus #error This is not a C+ compiler#endif#ifdef hpux #define ENVIRONMENT 1 / indicate the environment has been defined #define CPPATT 200 /

34、 AT&T C+ above version 2.0 #define BYTEREVERT 1 / the numeric byte order is revert with ISO #define OS_HPUX / this is hp machine & OS #ifndef UNIX / it is unix OS #define UNIX #endif#endif#ifdef _SGI_SOURCE #define ENVIRONMENT 1 / indicate the environment has been defined #define CPPATT 200 / AT&T C

35、+ above version 2.0 #define BYTEREVERT 0 / the numeric byte order is same as ISO #define OS_SGI / this is SGI machine & OS #define OS_IRIS / this is SGI machine & OS #ifndef UNIX / it is unix OS #define UNIX #endif#endif#ifdef sun #define ENVIRONMENT 1 / indicate the environment has been defined #define CPPATT 200 / AT&T C+ above version 2.0 #ifdef sparc / if is SPARC CPU #define BYTEREVERT 0 / the numeric byte order is same as ISO #else / if is other type CPU #define BYTEREVERT 1 / the numeric byte order is revert wi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1