C/C++语言编码规范C/C++语言编码规范
公开
V0.1
CMMI
2006年01月23日
EPG组
全公司
修改点说明的内容有如下几种:创建、修改(+修改说明)、删除(+删除说明)
第 2 页 共 27 页
41352800.doc 编号:
1 摘要 ............................................................................... 5 2 文件结构 ......................................................
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=-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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。