搜索
您的当前位置:首页[CC++]编程规范一:头文件篇

[CC++]编程规范一:头文件篇

来源:世旅网
[CC++]编程规范⼀:头⽂件篇

⼀般来说,每⼀个.cc或者.cpp⽂件对应⼀个头⽂件(.h⽂件),当然,也有例外,例如⼀些测试单元或者main⽂件,头⽂件的⼀些规范可以令代码可读性、程序的性能等⼤为改观,所以还是要注意头⽂件的规范问题。

⼀、#define保护

所有头⽂件为了防⽌⽂件被多重包含(multiple inclusion),⼀般就需要#define保护。#define保护的格式如下:

___H_

例如:

#ifndef FOO_BAR_BARZ_H_#define FOO_BAR_BARZ_H_...

#endif //FOO_BAR_BARZ_H_

这个是⽐较⽼的⼀个做法了,所以很多编译器基本都是可以兼容的,但是还有另⼀个语句也是可以起到相同作⽤,但是⼀些太⽼的编译器据说⽤不了的(但是我好像没遇到过),VS下好像默认新建⼀个类的头⽂件就会⽤这个新的:

#program once

这⼀种相对于第⼀种的好处是,不通过#define⼀个变量来起到防⽌重复包含,所以,不存在重复变量的问题,#define后⾯的变量在同⼀个⼯程⾥是不能重复的,重复的话是只认⼀个的,就可能导致另⼀个⽂件编译的时候被排除。

⼆、头⽂件依赖

在头⽂件中减少包含其他头⽂件,改⽤前置声明(forward declarations),理由是:头⽂件被包含的同时会引⼊⼀项新的依赖(dependency),只要头⽂件被修改,代码就要重新编译,如果你的头⽂件包含了其它头⽂件,这些头⽂件的任何改动都将导致那些包含了你的头⽂件的代码重新编译。

使⽤前置声明就是在头⽂件中添加:

class Foo;

然后在对应的源⽂件中包含对应的头⽂件

#include

可以这么做的⼏种情况:

1)、将数据声明为指针(Foo*)或者引⽤(Foo&); 2)、参数、返回值为Foo的函数只声明不定义;

3)、静态数据成员可以被声明为Foo,因为静态数据成员的定义在类定义之外;

但是,如果你的类是Foo的⼦类或者包含类型为Foo的⾮静态成员数据,则必须包含头⽂件。

补充说明,什么是声明,什么是定义,⼀般在头⽂件中经常看到⼀个函数,有返回值有输⼊参数,但是没有主体,或者⼀个变量声明为指针,但是没有new等操作,像这样的就是声明:

Foo *pFoo;

void setInputNumber(int num);

然后是定义,定义的话就是有函数主体,或者说就有变量的内存操作,包括⾮指针变量的声明也已经包含了定义,像这样的:

int nInputNumber;int nCount = 0;pFoo= new Foo();

void setInputNumber(int num){

nInputNumber = num;}

三、内联函数

当函数⼩于10⾏的时候可以定义为内联函数(inline function)。

定义:当函数被声明为内联函数后,编译器会将其内联展开,⽆需像通常的函数调⽤机制⼀样来调⽤内联函数。优点:可以令⽬标代码更⾼效。适合存取函数或⼀些较短的关键代码。缺点:滥⽤内联适得其反,内敛较⼤代码(如果编译器允许),将增加代码量;不可⽤或者尽量不要⽤内联函数的情况: 1)、超过10⾏代码; 2)、析构函数;

3)、递归函数(可能⼤多数编译器不⽀持); 4)、包含循环或者switch语句的函数;

四、头⽂件包含实现代码

⼀般来说,头⽂件是只包含声明,⽽不要包含实现代码的,但是⽤到内联函数或者函数模板的话就需要将代码实现写在⼀起,为了可读性,是可以新建⼀个后缀为-inl.h的头⽂件,专门⽤于存放内联函数和模板函数,这样可以增强代码可读性。需要注意,这样的头⽂件也要加#define保护的。

五、函数参数顺序(Function Parameter Ordering)

顺序:输⼊参数在前,输⼊输出参数居中,输出参数在后。

或者:输⼊参数在前,输⼊输出参数居中,输出参数在后,控制参数垫后。

输⼊参数⼀般为传值或者常数引⽤(const references),输出或者输⼊输出参数⼀般为传⾮常数指针(non-const pointers),有些参数是输⼊参数,但是属于控制变量意义的参数,那我是觉得应该放最后⾯的。

六、包含头⽂件顺序

如果我有⼀个命名为Foo.h的头⽂件以及⼀个对应的Foo.cpp的源⽂件,那么,头⽂件中的包含顺序应该是:C库 > C++库 > 其他库的.h⽂件 > 项⽬内的.h⽂件;⽽源⽂件中的包含顺序应该是:

#include \"Foo.h\" > C库 > C++库 > 其他库的.h⽂件 > 项⽬内的.h⽂件

还有⼀点强迫症的可以将同⽬录下的头⽂件按⾸字母顺序来排列。补充说明,#include \"\"和#include <>的区别:

1)、#include <>引⽤的是编译器的类库路径⾥⾯的头⽂件;⼀般编译器会在编译器设置的include⽬录和系统中的INCLUDE环境变量中找头⽂件;⼀般⽤于标准⽂件;

2)、#include \"\"引⽤程序⽬录的相对位置的头⽂件;⼀般是先从当前⽂件所在的⽂件夹内找,找不到再去编译器设置的include⽬录或者系统的INCLUDE环境变量中找;⼀般⽤于⾃定义的⽂件。

结语

编程规范⼀⽅⾯是给机器看,提⾼代码的效率,另⼀⽅⾯也⾮常重要的⽤于给⼈看,提⾼⼈的效率。上述规范不⼀定就完全正确或者必须这么做,只是给个建议,看别⼈代码是超级累的⼀件事,简直想⼤呼这TM写的啥啊,何况更可怕的是看完发现这TM是我⾃⼰写的代码,想死的⼼都有了,利⼈终利⼰,就算出错了也好意思找别⼈帮忙看啊。

川⼝⾬晴风复⽌,蜻蜓上下鱼东西。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top