C++代码规范

1.表示类型的名称必须混合使用,以大写字母开头。
Line, SavingsAccount

2.变量名必须混合使用,以小写字母开头。
line, savingsAccount

3.命名的常量(包括枚举值)必须是大写的,使用下划线分隔单词。(也就是宏定义用大写并下划线)
MAX_INERATIONS, COLOR_RED, PI

一般来说,这些常量的使用应该尽量减少。在许多情况下,将值实现为方法是更好的选择:

int getMaxIterations() // NOT: MAX_ITERATIONS = 25
{
		return 25;
}

4.表示方法或函数的名称必须是动词,并用小写字母开头的混合大小写书写。
getName(), computeTotalWidth()

5.缩写和首字母缩写在用作名称时不能是大写的。
exportHtmlSource(); // NOT: exportHTMLSource();
openDvdPlayer(); // NOT: openDVDPlayer();

6.私有类变量应该有下划线后缀。
class SomeClass {
private:
int length_;
}

7.泛型变量应该与其类型具有相同的名称。
void setTopic(Topic* topic) // NOT: void setTopic(Topic* value)
// NOT: void setTopic(Topic* aTopic)
// NOT: void setTopic(Topic* t)

void connect(Database* database) // NOT: void connect(Database* db)
                             	 // NOT: void connect (Database* oracleDB)

这些变量通常可以通过结合角色和类型来命名:
	Point  startingPoint, centerPoint;
	Name   loginName;

9.大范围的变量应该有长名称,小范围的变量可以有短名称[1]。
用于临时存储或索引的临时变量最好保持简短。读取这些变量的程序员应该能够假定它的值不会在几行代码之外使用。
整数的常用抓痕变量是i, j, k, m, n,字符c和d。

10.对象的名称是隐式的,应该在方法名称中避免。
line.getLength(); // NOT: line.getLineLength();

11.在直接访问属性时,必须使用术语get/set。
employee.getName();
employee.setName(name);

matrix.getElement(2, 4);
matrix.setElement(2, 4, value);

12.术语compute可用于计算某些内容的方法。
valueSet->computeAverage();
matrix->computeInverse()

13.find这个词可以用在查找某个东西的方法中。
vertex.findNearestVertex();
matrix.findMinElement();

14.在建立对象或概念时,可以使用术语initialize。
printer.initializeFontSet();
美式初始化比英式初始化更可取。应该避免init。

15.表示GUI组件的变量应该以组件类型名称作为后缀。
mainWindow, propertiesDialog, widthScale, loginText,
leftScrollbar, mainForm, fileMenu, minLabel, exitButton, yesToggle etc.

16.复数形式应该用于表示对象集合的名称。
vector points;
int values[];

17.前缀n应该用于表示许多对象的变量。
nPoints, nLines

18.后缀No应该用于表示实体编号的变量。
tableNo, employeeNo

19.前缀is应该用于布尔变量和方法。
isSet, isVisible, isFinished, isFound, isOpen

20.补码名称必须用于补码操作。
get/set, add/remove, create/destroy, start/stop, insert/delete,
increment/decrement, old/new, begin/end, first/last, up/down, min/max,
next/previous, old/new, open/close, show/hide, suspend/resume, etc.

21.名字中的缩写应该避免。
computeAverage(); // NOT: compAvg();

22.应该避免专门命名指针。
Line* line; // NOT: Line* pLine;
// NOT: LIne* linePtr;

23.必须避免否定的布尔变量名。
bool isError; // NOT: isNoError
bool isFound; // NOT: isNotFound

24.枚举常数可以用公共类型名作为前缀。
enum Color {
COLOR_RED,
COLOR_GREEN,
COLOR_BLUE
};

25.异常类应该以Exception作为后缀。
class AccessException
{
:
}

26.函数(方法返回某些内容)应该根据它们返回的内容命名,过程(void方法)根据它们执行的内容命名。

27.c++头文件应该扩展名为.h(首选)或.hpp。源文件的扩展名可以是.c++(推荐)、.c、.cc或.cpp。
MyClass.c++, MyClass.h

类应该在头文件中声明,并在源文件中定义,其中文件的名称与类的名称匹配。

使查找给定类的关联文件变得容易。一个明显的例外是模板类必须在.h文件中声明和定义。

28.所有定义都应该驻留在源文件中。
class MyClass
{
public:
int getValue () {return value_;} // NO!

private:
	int value_;
}
头文件应该声明一个接口,源文件应该实现它。在寻找实现时,程序员应该始终知道它是在源文件中找到的。

29.文件内容必须保持在80列以内。

30.必须避免像制表符和分页符这样的特殊字符。

31.分割线的不完全性必须是明显的。
totalSum = a + b + c +
d + e;

function (param1, param2,
      param3);

setText ("Long line split"
     "into two parts.");

for (int tableNo = 0; tableNo < nTables;
 	tableNo += tableStep) {
...
}	
当一个语句超过上面给出的80列限制时,就会出现分割行。对于如何分割行,很难给出严格的规则,但是上面的示例应该给出一个大致的提示。
一般来说:
	在逗号之后停顿。
	在操作员之后断开。
	将新行与前一行表达式的开头对齐。

32.包括文件和语句
#ifndef COM_COMPANY_MODULE_CLASSNAME_H
#define COM_COMPANY_MODULE_CLASSNAME_H
:
#endif // COM_COMPANY_MODULE_CLASSNAME_H
构造是为了避免编译错误。名称约定类似于文件在源树中的位置,可以防止命名冲突。

33.Include语句应该进行排序和分组。按其在系统中的层次位置排序,先包含低层文件。在包含语句组之间留下空行。
#include
#include

#include <qt/qbutton.h>
#include <qt/qtextfield.h>

#include "com/company/ui/PropertiesDialog.h"
#include "com/company/ui/MainWindow.h"
包含文件路径永远不能是绝对的。相反,应该使用编译器指令来指示include的根目录。

34.类型转换必须始终显式地进行。永远不要依赖隐式类型转换。
floatValue = static_cast(intValue); // NOT: floatValue = intValue;

35.变量应该在声明的地方初始化。

36.永远不要将类变量声明为public。

37.c++指针和引用应该将它们的引用符号放在类型旁边,而不是名字旁边。
float* x; // NOT: float *x;
int& y; // NOT: int &y;

38.除了布尔变量和指针外,不应该使用0的隐式测试。
if (nLines != 0) // NOT: if (nLines)
if (value != 0.0) // NOT: if (value)

39.变量应该在尽可能小的范围内声明。

40.只有循环控制语句必须包含在for()构造中。
sum = 0; // NOT: for (i = 0, sum = 0; i < 100; i++)
for (i = 0; i < 100; i++)
sum += value[i];
sum += value[i];

41.循环变量应该在循环之前立即初始化。
isDone = false; // NOT: bool isDone = false;
while (!isDone) { // :
: // while (!isDone) {
} // :
// }

42.可以避免do-while循环。

43.应该避免在循环中使用break和continue。

44.while(true)应该用于无限循环。
while (true) {
:
}

for (;;) {  // NO!
:
}

while (1) { // NO!
:
}

45.必须避免使用复杂的条件表达式。引入临时布尔变量代替。

bool isFinished = (elementNo < 0) || (elementNo > maxElement);
bool isRepeatedEntry = elementNo == lastElement;
if (isFinished || isRepeatedEntry) {
:
}

// NOT:
if ((elementNo < 0) || (elementNo > maxElement)||
 		elementNo == lastElement) {
:
}

46.在if语句中,应该将标称大小写放在if部分,而将异常放在else部分。
bool isOk = readFile (fileName);
if (isOk) {
:
}
else {
:
}

47.必须避免条件语句中的可执行语句。
File* fileHandle = open(fileName, “w”);
if (!fileHandle) {
:
}

// NOT:
if (!(fileHandle = open(fileName, "w"))) {
  :
}

48.应该避免在代码中使用魔法数字。除了0和1之外的数字应该被认为是被命名的常量。

49.应该使用“0”而不是“NULL”。
NULL是标准C库的一部分,但是在c++中已经过时了。

50.块布局应该如下面的例1(推荐)或例2所示,而不能如例3所示。函数和类块必须使用例2中的块布局。
while (!done) {
doSomething();
done = moreToDo();
}

while (!done)
{
  doSomething();
  done = moreToDo();
}

51.类声明应该有以下形式:
class SomeClass : public BaseClass
{
public:

  protected:
    ...

  private:
    ...
}

52.if-else类语句应该具有以下形式:
if (condition) {
statements;
}

if (condition) {
  statements;
}
else {
   statements;
}

if (condition) {
  statements;
}
else if (condition) {
  statements;
}
else {
  statements;
}

53.for声明的格式
for (initialization; condition; update) {
statements;
}

54.while语句的格式如下:
while (condition) {
statements;
}

55.do-while语句应该具有以下形式:
do {
statements;
} while (condition);

56.switch语句应该具有以下形式:
switch (condition) {
case ABC :
statements;
// Fallthrough
当case语句没有break语句时,应该包含显式的Fallthrough注释。离开突发事件是一个常见的错误,必须清楚地表明,当它不存在时,它是故意的。

  case DEF :
    statements;
    break;

  case XYZ :
    statements;
    break;

  default :
    statements;
    break;
}

57.try-catch语句应采用以下形式:
try {
statements;
}
catch (Exception& exception) {
statements;
}

58.函数返回类型可以放在函数名的左边一栏。
void
MyClass::myMethod(void)
{
:
}

59.-传统的运算符应该被空格字符包围。

  • c++保留字后面应该有一个空格。
    -逗号后面应该有空格。
    -冒号周围应该有空白。
    -语句中的分号后面应该跟一个空格字符。
a = (b + c) * d; // NOT: a=(b+c)*d

while (true)   // NOT: while(true) 
{
  ...

doSomething(a, b, c, d);  // NOT: doSomething(a,b,c,d);

case 100 :  // NOT: case 100:

for (i = 0; i < 10; i++) {  // NOT: for(i=0;i<10;i++){
  ...

57.当方法名后面跟着另一个名称时,方法名后面可以跟一个空白。
doSomething (currentFile);

58.块内的逻辑单元应该用空行分隔。
Matrix4x4 matrix = new Matrix4x4();

double cosAngle = Math.cos(angle);
double sinAngle = Math.sin(angle);

matrix.setElement(1, 1,  cosAngle);
matrix.setElement(1, 2,  sinAngle);
matrix.setElement(2, 1, -sinAngle);
matrix.setElement(2, 2,  cosAngle);

multiply(matrix);

59.方法之间应该用三行空白隔开。

60.在增强可读性的地方使用对齐。

if (a == lowValue) compueSomething();
else if (a == mediumValue) computeSomethingElse();
else if (a == highValue) computeSomethingElseYet();

value = (potential * oilDensity) / constant1 +
(depth * waterDensity) / constant2 +
(zCoordinateValue * gasDensity) / constant3;

minPosition = computeDistance(min, x, y, z);
averagePosition = computeDistance(average, x, y, z);

switch (value) {
case PHASE_OIL : strcpy(phase, “Oil”); break;
case PHASE_WATER : strcpy(phase, “Water”); break;
case PHASE_GAS : strcpy(phase, “Gas”); break;
}

61.对所有注释使用//,包括多行注释。
// Comment spanning
// more than one line.
在“//”和实际注释之间应该有一个空格,注释应该总是以大写字母开头,以句号结尾。

62.注释应该包括相对于它们在代码中的位置。

while (true) { // NOT: while (true) {
// Do something // Do something
something(); something();
} }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值