为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C/C++语言编码规范

2017-09-18 34页 doc 64KB 20阅读

用户头像

is_574951

暂无简介

举报
C/C++语言编码规范C/C++语言编码规范 公开 V0.1 CMMI 2006年01月23日 EPG组 全公司 修改点说明的内容有如下几种:创建、修改(+修改说明)、删除(+删除说明) 第 2 页 共 27 页 41352800.doc 编号: 1 摘要 ............................................................................... 5 2 文件结构 ......................................................
C/C++语言编码规范
C/C++语言编码规范 公开 V0.1 CMMI 2006年01月23日 EPG组 全公司 修改点说明的内容有如下几种:创建、修改(+修改说明)、删除(+删除说明) 第 2 页 共 27 页 41352800.doc 编号: 1 摘要 ............................................................................... 5 2 文件结构 ........................................................................... 5 2.1 文件前言 ...................................................................... 5 2.2 头文件的结构 .................................................................. 5 2.2.1 头文件内容组成 ........................................................... 5 2.2.2 ..................................................................... 5 2.3 定义文件的结构 ................................................................ 6 2.3.1 定义文件内容组成 ......................................................... 6 3 函数 ........................................................................... 6 4 程序的板式 ......................................................................... 9 4.1 代码行 ........................................................................ 9 4.2 空行 ......................................................................... 10 4.3 代码行内的空格 ............................................................... 11 4.4 对齐 ......................................................................... 12 4.5 注释 ......................................................................... 13 4.5.1 注释用途 ................................................................ 13 4.5.2 注释原则 ................................................................ 14 5 命名规则 .......................................................................... 14 5.1 命名原则 ..................................................................... 14 5.2 参考规则 ..................................................................... 15 6 其他 .............................................................................. 16 6.1 数据类型 ..................................................................... 16 6.2 整型数据类型 ................................................................. 16 6.3 运算符优先级 ................................................................. 17 6.4 错误码 ....................................................................... 17 6.5 比较语句 ..................................................................... 17 6.6 数字 ......................................................................... 17 6.7 宏 ........................................................................... 17 第 3 页 共 27 页 41352800.doc 编号: 6.8 有效利用资源 ................................................................. 18 6.9 健壮性 ....................................................................... 18 6.10 可移植性 ..................................................................... 18 6.11 全局变量 ..................................................................... 18 6.12 编译环境 ..................................................................... 18 6.13 动态库 ....................................................................... 18 7 附件一 关于类的补充说明 ............................................................ 19 7.1 类的版式 ..................................................................... 19 7.2 类的命名规则 ................................................................. 19 7.3 类的构造函数、析构函数与赋值函数 .............................................. 19 7.4 类的继承与组合 ............................................................... 19 8 附件二 核心程序的补充说明 .......................................................... 20 8.1 编程语言 ..................................................................... 20 8.2 识别核心开发原则 ............................................................. 20 9 附件三 错误码定义参考 .............................................................. 20 9.1 错误类型定义 ................................................................. 20 9.2 错误类型分类 ................................................................. 20 第 4 页 共 27 页 41352800.doc 编号: 1 该文本的目标是统一规范公司程序的风格,提高程序代码的可读性。最终目的是提高软件的可维护性, 从而提高软件的质量。该文本作为程序规范的初稿,仍有需要改进之处。希望诸位多提建设性意见或建议 来共同促成程序规范的最终形成。因为该文本相对比较的冗长,所以为了突出重点笔者把现阶段尤为重要 的地方用红色文字书写,希望能够引起足够的主意。 2 缩进应该是每行2个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度. 你可以禁止保存Tab字符, 方法是通过 Tools | Environment 菜单打开 Environment Options 对话框, 然后在 Editor 页中关闭 "Use tab character" 和 "Optimal fill" 选项. 2.2.1 1) 文件前言 2) 预处理块(防止头文件被重复引用) 3) 数据类型定义 4) 数据和函数声明 5) 文件结束标志 /**/ 2.2.2 1) 头文件中只可定义数据类型,不能生成数据实例 (如定义变量) 2) 除作为接口使用的头文件外,禁止包含其他的头文件。可用注释或编译指令明对其他头文件的依赖。 3) 提供给项目外部做接口使用的头文件,可以包含其他的头文件,应满足自足性 第 5 页 共 27 页 41352800.doc 编号: /*文件前言*/ #ifndef GRAPHICS_H /* 防止graphics.h被重复引用*/ #define GRAPHICS_H void Function1(„); /* 全局函数声明*/ „ typedef struct tagBox { „ }Box_T; 头文件构成 #endif 2.3.1 3 1)函数体的规模要小,尽量控制在50行代码之内。 2)错误码通过函数返回值返回,错误码类型必须足以反映函数终结时所有可能的状态 3)不要省略返回值的检查。 4)参数顺序:目的参数放在前面,源参数放在后面。(输出+输入输出+输入) 5)尽量避免函数的参数超过8个 6)函数的功能要单一,不要设计多用途的函数。 7)函数单入口,单出口结构。不要在多个地方返回。可以用顺序语句或者采用goto语句实现, 8)不仅要检查输入参数的有效性,还要检查通过其它途径进入函数体内的变量的有效性,例如全局变量、 文件句柄等。 9)内存使用 申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。 10)尽可能在定义变量的同时初始化该变量(就近原则) int width = 0; 定义并初绐化width 第 6 页 共 27 页 41352800.doc 编号: 11)如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。 例如:void StringCopy(char *strDestination,const char *strSource); 12)函数的头部应进行注释列出:目的,参数解释,返回值解释。复杂函数建议给出典型用法 例,函数的两种常用单出口结构, 相对而言,第二种方式更简洁: const BYTE* pbData: /*input symbol data*/ int nxSize: /*image width */ int nySize: /*image height */ BYTE* pbFeature: /*output feature */ int nDimension: /*feature dimension */ HRESULT GetFeatureValue(const BYTE* pbData, int nxSize, int nySize, BYTE* pbFeature, int nDimension) { HRESULT hr = S_OK; if (pbData == NULL || pbFeature == NULL || nxSize < 1 || nySize < 1 || nDimension < 1) { hr = E_INVALIDARG; } BYTE *pbNormlizedData = NULL; if (SUCCEDED(hr)) { pbNormlizedData = new BYTE[NORMALIZED_SIZE * NORMALIZED_SIZE]; if (pbNormlizedData == NULL) { hr = E_OUTOFMEMORY; } } if (SUCCEDED(hr)) { ZeroMemory(pbNormlizedData, NORMALIZED_SIZE * NORMALIZED_SIZE * sizeof(BYTE)); hr = AdaptiveNormalize(pbData , pbNormlizedData, NORMALIZED_SIZE, NORMALIZED_SIZE); 第 7 页 共 27 页 41352800.doc 编号: } if (SUCCEDED(hr)) { ZeroMemory(pbFeature, nDimension * sizeof(BYTE)); hr = OfflineFeature(pbNormlizedData, pbFeature, nDimension); } if (FAILED(hr)) { DEBUGPRINTF(_T("%s(%d): Error in %s. HRESULT = 0x%08X\n"), _T(__FILE__), __LINE__, _T(__FUNCTION__), hr ); } SAFE_ARRAY_DELETE(pbNormlizedData); return hr; } HRESULT GetFeatureValue(const BYTE* pbData, int nxSize, int nySize, BYTE* pbFeature, int nDimension) { HRESULT hr = S_OK; if (pbData == NULL || pbFeature == NULL || nxSize < 1 || nySize < 1 || nDimension < 1) { hr = E_INVALIDARG; goto Cleanup; } BYTE pbNormlizedData[NORMALIZED_SIZE * NORMALIZED_SIZE]; ZeroMemory(pbNormlizedData, NORMALIZED_SIZE * NORMALIZED_SIZE * sizeof(BYTE)); hr = AdaptiveNormalize(pbData , pbNormlizedData, NORMALIZED_SIZE, NORMALIZED_SIZE); if ( FAILED(hr) ) { goto Cleanup; } 第 8 页 共 27 页 41352800.doc 编号: ZeroMemory(pbFeature, nDimension * sizeof(BYTE)); hr = OfflineFeature(pbNormlizedData, pbFeature, nDimension); if (FAILED(hr)) { goto Cleanup; } Cleanup: if (FAILED(hr)) { DEBUGPRINTF(_T("%s(%d): Error in %s. HRESULT = 0x%08X\n"), _T(__FILE__), __LINE__, _T(__FUNCTION__), hr ); } return hr; } 4 4.1 1. 一行代码只做一件事情,如只定义一个变量,只写一条语句。这样的代码容易阅读,并且方便于写注 释。 2. if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样 可以防止书写失误。 风格良好的代码行, 为风格不良的代码行。 int width; /*宽度*/ int width, height, depth; /*宽度高度深int height; /*高度*/ 度*/ int depth; /*深度*/ x = a + b; X = a + b; y = c + d; z = e + f; y = c + d; z = e + f; If (width < height) if (width < height) dosomething(); 第 9 页 共 27 页 41352800.doc 编号: { dosomething(); } for (initialization; condition; update) for (initialization; condition; update) { dosomething(); dosomething(); other(); } /* 空行*/ other(); 3. 代码行最大长度宜控制在78个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。 4. 长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新 行要进行适当的缩进,使排版整齐,语句可读。 if ((very_longer_variable1 >= very_longer_variable12) && (very_longer_variable3 <= very_longer_variable14) && (very_longer_variable5 <= very_longer_variable16)) { dosomething(); } 长行的拆分 4.2 1. 在每个类声明之后、每个函数定义结束之后都要加空行。参见示例(a) 2. 在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。参见示例(b ) /* 空行*/ /* 空行*/ void Function1(„) while (condition) { { „ statement1; } /* 空行*/ /* 空行*/ if (condition) 第 10 页 共 27 页 41352800.doc 编号: void Function2(„) { { statement2; „ } } else /* 空行*/ { void Function3(„) statement3; { } „ /* 空行*/ } statement4; } (a) 函数之间的空行 (b) 函数内部的空行 4.3 1. 关键字之后要留空格。象const、case 等关键字之后至少要留一个空格,否则无法辨析关键字。象 if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。 2. 函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。 3. ‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。 4. ‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition; update)。 5. 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、 “*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。 6. 一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。 7. 象“[]”、“.”、“->”这类操作符前后不加空格。 8. 对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for (i=0; i<10; i++)和if ((a<=b) && (c<=d)) void Func1(int x, int y, int z); /*良好的风格*/ void Func1 (int x,int y,int z); /*不良的风格*/ 第 11 页 共 27 页 41352800.doc 编号: If (year >= 2000) /*良好的风格*/ if(year>=2000) /*不良的风格*/ if ((a>=b) && (c<=d)) /*良好的风格*/ if(a>=b&&c<=d) /*不良的风格*/ for (i = 0; i < 10; i++) /*良好的风格*/ for(i=0;i<10;i++) /*不良的风格*/ x = a < b ? a : b; /*良好的风格*/ x=a要求
,采用下面的方式 typedef char Int8; typedef short Int16; typedef unsigned char Uint8; 第 16 页 共 27 页 41352800.doc 编号: typedef unsigned short Uint16; 6.3 若表达式运算符较多,用括号清楚地表达运算顺序。避免使用默认的优先级。 如: if ((a | b) && (a & c)) 6.4 软件项目要设计错误码来反映程序所有可能的运行状态。错误码集合要合理,够用。附件三列举了一些错 误码,仅作为软件项目设计错误码的参考。 6.5 1) 应当将整型变量用“==”或“!=”直接与0比较。 if (value != 0) 2) 不可将浮点变量用“==”或“!=”与任何数字比较 if (x == 0.0) 隐含错误的比较 转化为 if ((x>=-EPSINON) && (x<=EPSINON)) 其中EPSINON是允许的误差(即精度)。 3) 应当将指针变量用“==”或“!=”与NULL比较。 if (p != NULL) 不要写成 if (p != 0) 容易让人误解p是整型变量 6.6 避免在代码中出现立即数,一般0和1除外 6.7 1) 尽量用枚举类型或者常数(const)类型来代替数值宏 2) 避免使用功能复杂的功能宏 第 17 页 共 27 页 41352800.doc 编号: 6.8 1)尽量用枚举类型或者常数(const)类型来代替数值宏 2)避免使用功能复杂的功能宏 6.9 1) 资源分配失败 2) 执行环境变化 3) 内存访问越界 4) 野指针 (指向无效的内存区域) 5) 使用安全的库函数 6) 其他可能的意外情况处理 6.10 1)避免平台相关的假设 数据类型长度 字节顺序 2) 避免依赖特定编译器的编码 3)平台相关的代码集中存放 6.11 1) 避免使用 2) 如必须使用(项目组讨论通过)应实现最大程度的封装,尽量减少访问全局变量的代码范围。 a) 策略:通过调用函数访问全局变量 6.12 把编译器的选择项设置为最严格状态, 不允许有Warning. 6.13 生成动态连接库须保持谨慎,由项目组充分考虑其利弊后决定。 第 18 页 共 27 页 41352800.doc 编号: 7 7.1 1) 简单的类:公共函数在前,私有数据在后 2) 复杂的类:先分成不同的区域,在同一个功能区域内遵循1 7.2 除MFC及其继承类之外,类名首字母大写,并以_T结尾。如:HWRegion_T 7.3 1) 建议类成员的初始化尽量使用初始化列表。 2) 避免使用构造函数初始化静态成员。 3) 倘若类中包含资源管理(如有动态分配内存的指针变量),建议定义拷贝构造函数、赋值函数和析构 函数。 如: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operate =(const String &other); // 赋值函数 private: char *m_data; // 用于保存字符串 }; 7.4 1) 建议类的继承层数不超过5层。 2) 必须显式指出继承的虚函数。 3) 不要重新定义继承来的非虚函数。 第 19 页 共 27 页 41352800.doc 编号: 8 8.1 嵌入式系统建议使用c语言, 禁止或避免使用c++。若采用标准c语言,编码规范应参照《HWCodingGuideline_standard_c》。除此之外,还应该参考本文档提供的有关核心软件开发的一些原则 8.2 1) 禁止或避免使用任何库函数,包括strcpy()、memmove()等。 2) 优化内存的使用效率,包括访问速度和所分配内存的利用率两个方面 3) 定义数据结构和内存使用中,注意4字节对齐。 4) 尽量使用基本数据类型或定义自己的数据类型,如int、char等,禁止或避免使用平台相关的数据类 型。 5) 将平台相关的代码,单独放在在某个模块内,如对外的API接口模块,与识别核心的原始代码分开。 9.1 typedef long HRESULT; #define SUCCEEDED(Status) ((HRESULT)(Status) >= 0) #define FAILED(Status) ((HRESULT)(Status)<0) #define S_OK 0 #define S_FALSE -1 9.2 1.意外的失败 // Error codes // // // MessageId: E_UNEXPECTED // 第 20 页 共 27 页 41352800.doc 编号: // MessageText: // // Catastrophic failure // #define E_UNEXPECTED -101 2.未实现 // MessageId: E_NOTIMPL // // MessageText: // // Not implemented // #define E_NOTIMPL -102 3.未能分配所需的内存 // // MessageId: E_OUTOFMEMORY // // MessageText: // // Ran out of memory // #define E_OUTOFMEMORY -103 4.一个或多个参数无效 // // MessageId: E_INVALIDARG // // MessageText: // // One or more arguments are invalid 第 21 页 共 27 页 41352800.doc 编号: // #define E_INVALIDARG -104 5.不支持此接口 // // MessageId: E_NOINTERFACE // // MessageText: // // No such interface supported // #define E_NOINTERFACE -105 6.无效指针 // // MessageId: E_POINTER // // MessageText: // // Invalid pointer // #define E_POINTER -106 7.无效句柄 // // MessageId: E_HANDLE // // MessageText: // // Invalid handle // #define E_HANDLE -107 第 22 页 共 27 页 41352800.doc 编号: 8.操作已中止 // // MessageId: E_ABORT // // MessageText: // // Operation aborted // #define E_ABORT -108 9.未指定的失败 // // MessageId: E_FAIL // // MessageText: // // Unspecified error // #define E_FAIL -109 10.一般的访问被拒绝错误 // // MessageId: E_ACCESSDENIED // // MessageText: // // General access denied error // #define E_ACCESSDENIED -110 11.数据准备错误 // 第 23 页 共 27 页 41352800.doc 编号: // MessageId: E_PENDING // // MessageText: // // The data necessary to complete this operation is not yet available. // #define E_PENDING -111 12.错误的文件操作 // // MessageId: ERROR_INVALID_FUNCTION // // MessageText: // // Incorrect function. // #define ERROR_INVALID_FUNCTION -201 // dderror 13.没有发现指定的文件 // // MessageId: ERROR_FILE_NOT_FOUND // // MessageText: // // The system cannot find the file specified. // #define ERROR_FILE_NOT_FOUND -202 14.没有找到指定的路径 // // MessageId: ERROR_PATH_NOT_FOUND // // MessageText: 第 24 页 共 27 页 41352800.doc 编号: // // The system cannot find the path specified. // #define ERROR_PATH_NOT_FOUND -203 15.文件打开太多,无法再打开文件 // // MessageId: ERROR_TOO_MANY_OPEN_FILES // // MessageText: // // The system cannot open the file. // #define ERROR_TOO_MANY_OPEN_FILES -204 16.文件拒绝访问 // // MessageId: ERROR_ACCESS_DENIED // // MessageText: // // Access is denied. // #define ERROR_ACCESS_DENIED -205 17.无效的文件句柄 // // MessageId: ERROR_INVALID_HANDLE // // MessageText: // // The handle is invalid. // 第 25 页 共 27 页 41352800.doc 编号: #define ERROR_INVALID_HANDLE -206 19.内存不够 // // MessageId: ERROR_NOT_ENOUGH_MEMORY // // MessageText: // // Not enough storage is available to process this command. // #define ERROR_NOT_ENOUGH_MEMORY -207 // dderror 20.内存不够 // // MessageId: ERROR_OUTOFMEMORY // // MessageText: // // Not enough storage is available to complete this operation. // #define ERROR_OUTOFMEMORY -208 21.无效的驱动器 // // MessageId: ERROR_INVALID_DRIVE // // MessageText: // // The system cannot find the drive specified. // #define ERROR_INVALID_DRIVE -209 22.无法删除当前路径 // 第 26 页 共 27 页 41352800.doc 编号: // MessageId: ERROR_CURRENT_DIRECTORY // // MessageText: // // The directory cannot be removed. // #define ERROR_CURRENT_DIRECTORY -210 23.无文件 // // MessageId: ERROR_NO_MORE_FILES // // MessageText: // // There are no more files. // #define ERROR_NO_MORE_FILES -211 24.文件写保护 // // MessageId: ERROR_WRITE_PROTECT // // MessageText: // // The media is write protected. // #define ERROR_WRITE_PROTECT -212 第 27 页 共 27 页
/
本文档为【C/C++语言编码规范】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索