t=j;
if(t!
=1)
{.5.
Q/ECC/BJ010—2001
work=a[t];
a[t]=a[i];
a[i]=work;
}
}
}
——文件之中不得存在无规则的空行,比如说连续十个空行。
一般来讲函数与函数之间的空行为2-3行;
在函数体内部,在逻辑上独立的两个函数块可适当空行,一般为1-2行。
——程序编写首先应考虑清晰性,不要刻意追求技巧性而使得程序难以理解。
——每行长度尽量避免超过屏幕宽度,应不超过80个字符。
——除非对效率有特殊要求,编写程序要作到清晰第一,效率第二。
——尽可能使用函数库。
——尽量用公共过程或子程序去代替重复的功能代码段。
要注意,这个代码应具有一个独立的功能,不要只因代码形式一样便将其抽出组成一个公共过程或子程序。
——使用括号清晰地表达算术表达式和逻辑表达式的运算顺序。
如将x=a*b/c*d写成x=(a*b/c)*d可避免阅读者误解为x=(a*b)/(c*d)。
——避免不必要的转移。
——避免采用过于复杂的条件测试。
——避免过多的循环嵌套和条件嵌套。
——建议不要使用*=,^=,/=等运算符。
——一个函数不要超过200行。
一个文件应避免超过2000行。
——尽量避免使用goto语句。
——避免采用多赋值语句,如x=y=z;
——不鼓励采用?
:
操作符,如z=(a>b)?
a:
b;
——不要使用空的ifelse语句。
如
if(cMychar>=‘A’)
if(cMychar<=‘Z’)
printf(“Thisisaletter\n”);
else
printf(“Thisisnotaletter\n”);
else到底是否定哪个if容易引起误解。
可通过加{}避免误解。
——尽量减少使用“否定”条件的条件语句。
如:
把if(!
((cMychar<’0’)||(cMychar>’9’)))
改为if((cMychar>=’0’)&&(cMychar<=’9’))
C/C++编程规范1.0(2009-03-1819:
31:
51)
标签:
杂谈
规范说明...2
第一部分文件结构...3
第1节头文件(.H)3
第2节定义文件(.CPP/.C)5
第3节文件的组织...6
第二部分排版...7
第1节空行...7
第2节代码行...8
第3节代码行内的空格...9
第4节对齐...10
第5节长行拆分...12
第6节修饰符的位置...12
第7节注释...13
第8节类的版式...14
第三部分命名规则...16
第四部分表达式和基本语句...23
第五部分常量...27
第六部分函数...28
第1节参数...28
第2节返回值...30
第3节函数体...30
第4节成员函数...30
第5节重载、覆盖和隐藏...31
第6节内联...32
第7节其他...33
第七部分内存管理...34
第八部分类...35
第1节构造函数和析构函数...35
第2节拷贝构造函数和赋值函数...36
第3节成员变量...38
第4节成员函数...38
第九部分数据类型...39
规范说明
本规范适用的对象是天晴数码娱乐有限公司程序部从事C++编程工作的员工。
本规范各款“规则”或“建议”标准的制定原则:
兼容公司程序部的历史代码,提高公司程序部的代码的可读性、一致性和健壮性,人的效率优先而不是机器效率优先。
本规范中的【规则x-x-x】部分内容为公司强制执行的标准,【建议x-x-x】部分内容为公司推荐的标准。
强制标准:
公司程序部的所有员工编写C++代码不应与该规范的规则标准相抵触,违反规则标准编写的C++代码,由违反者改正。
建议标准:
是一种良好的C++编程风格,由于各种因素公司只推荐使用。
公司程序部员工可以不按照某款建议标准编写C++代码。
对本规范的不同意见或建议可通过正式途径提交,公司将在下一版规范中采纳或不采纳提出的意见或建议。
正式途径由程序部行政部们另行建立。
第一部分文件结构
第1节头文件(.H)
【规则1-1-1】版权的声明
版权的声明位于头文件和定义文件的开头(参见示例1-1-1),主要内容有:
(1)版权信息。
(2)创建者。
(3)创建日期。
(4)简要描述。
【示例1-1-1】
////////////////////////////////////////////////////////////////////////
//Copyright(c)1999-2006,TQDigitalEntertainment,AllRightsReserved
//Author:
WUYongmin
//Created:
2006/03/20
//Describe:
简要描述本文件的功能
////////////////////////////////////////////////////////////////////////
【规则1-1-2】头文件的组成
头文件由三部分内容组成:
(1)头文件开头处的版权声明(参见示例1-1-1)。
(2)预处理块。
(3)函数和类结构声明等。
假设头文件名称为graphics.h,头文件的结构参见示例1-1-2。
【示例1-1-2】
//版权和版本声明见示例1-1,此处省略。
#ifndef _TQ_GRAPHICS_H_//防止graphics.h被重复引用
#define _TQ_GRAPHICS_H_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
#include //引用标准库的头文件,必须使用<>
…
#include“myheader.h” //引用非标准库的头文件,必须使用""
…
namespacetq //命名空间
{
classCBox //类结构声明
{
…
};
…
voidFunction1(…); //全局函数声明
}
#endif //endofdefine_GRAPHICS_H_
【规则1-1-3】防止头文件重复应用预处理块
为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。
【规则1-1-4】标准库的头文件的引用
用#include格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
【规则1-1-5】非标准库头文件的引用
用#include“filename.h”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
【规则1-1-6】不允许使用全局类类型变量
尽量不要在头文件中出现象externCClassNameobj这类声明,以防止全局对象初始化时,多个类对象的构造函数和析购函数的调用顺序混乱。
可用全局函数代替全局类类型变量。
【规则1-1-7】发布的头文件应通过完整性检查
发布的头文件(例如:
header.h),应用如下的test.cpp编译通过,以检查头文件相应的完整性与自包含性。
test.cpp文件的内容如下:
#include"header.h" //检查头文件的完整性
#include"header.h" //检查头文件的是否被重复引用
【建议1-1-1】头文件中只存放“声明”而不存放“定义(实现代码)”
在C++语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。
这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。
建议将成员函数的定义与声明分开,不论该函数体有多么小。
如果想通过内联函数提高代码效率,可在定义文件中相应的成员函数实现代码前加上关键字inline(参见规则6-5-1)。
第2节定义文件(.CPP/.C)
【规则1-2-1】定义文件的组成
(1) 定义文件开头处的版权声明(参见示例1-1-1)。
(2) 对一些头文件的引用。
(3) 程序的实现体(包括数据和代码)。
假设定义文件的名称为graphics.cpp,定义文件的结构参见示例1-2-1。
【示例1-2-1】
//版权和版本声明见示例1-1,此处省略。
#include“graphics.h” //引用头文件
…
//类成员函数的实现体
voidCBox:
:
Draw(…)
{
…
}
//全局函数的实现体
voidFunction1(…)
{
…
}
第3节文件的组织
【规则1-3-1】文件应与类设计相对应
将一个类分解给2个文件存储。
一个是头文件(.h),用于声明类的成员变量和成员函数;另一是定义文件(.cpp/.c),用于类的成员变量的初始化和成员函数的具体实现。
【规则1-3-2】不要将多个类的设计放在同一个“头文件/定义文件”中
接口类不必遵守该规则。
【建议1-3-1】目录结构
需要公开的头文件(如接口)保存于Include目录或Inc,将不需要公开的头文件和定义文件保存于Source目录或Src。
【建议1-3-2】不要将一个类的设计放在一个头文件和多个定义文件
如果出现定义文件太大,不得不分解为多个定义文件的情况,应考虑类的设计是否恰当。
第二部分排版
第1节空行
【规则2-1-1】类声明、函数定义之后空行
在每个类声明之后、每个函数定义结束之后都要加空行。
参见示例2-1-1(a)
【规则2-1-2】函数体内,逻辑中断空行
在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
参见示例2-1-1(b)
【示例2-1-1】(a-b)
//空行
voidFunction1(…)
{
…
}
//空行
voidFunction2(…)
{
…
}
//空行
voidFunction3(…)
{
…
}
//空行
while(condition)
{
statement1;
//空行
if(condition)
{
statement2;
}
else
{
statement3;
}
//空行
statement4;
}
示例2-1-1(a)函数之间的空行 示例2-1-1(b)函数内部的空行
第2节代码行
【规则2-2-1】if、for、while、do等语句自占一行
执行语句不得紧跟其后。
不论执行语句有多少都要加{}。
这样可以防止书写失误。
示例2-2-1(a)为风格良好的代码行,示例2-2-1(b)为风格不良的代码行。
【示例2-2-1】(a-b)
intnWidth; //宽度
intnHeight; //高度
intnDepth; //深度
intnWidth,nHeight,nDepth;//宽度高度深度
x=a+b;
y=c+d;
z=e+f;
X=a+b; y=c+d; z=e+f;
if(nWidth{
dosomething();
}
if(nWidth
for(initialization;condition;update)
{
dosomething();
}
//空行
other();
for(initialization;condition;update)
dosomething();
other();
示例2-2-1(a)风格良好的代码行 示例2-2-1(b)风格不良的代码行
【规则2-2-2】就近原则,变量在使用前才定义
如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。
如果引用了未被初始化的变量,可能会导致程序错误。
【规则2-2-3】变量定义时必须初始化
【示例2-2-2】
intnWidth=10; //定义并初绐化width
intnHeight=10; //定义并初绐化height
intnDepth=10; //定义并初绐化depth
【建议2-2-1】一行代码只做一件事情
如只定义一个变量,或只写一条语句。
这样的代码容易阅读,并且方便于写注释。
第3节代码行内的空格
【规则2-3-1