google+c++编程风格

google+c++编程风格

ID:25504116

大小:109.77 KB

页数:61页

时间:2018-11-20

google+c++编程风格_第1页
google+c++编程风格_第2页
google+c++编程风格_第3页
google+c++编程风格_第4页
google+c++编程风格_第5页
资源描述:

《google+c++编程风格》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、GoogleC++编程风格1-头文件2010年9月1日11:58·1.头文件通常每一个.cc文件都有一个对应的.h文件.也有一些常见例外,如单元测试代码和只包含main()函数的.cc文件.正确使用头文件可令代码在可读性、文件大小和性能上大为改观.下面的规则将引导你规避使用头文件时的各种陷阱.1.1.#define保护Tip:所有头文件都应该使用#define防止头文件被多重包含,命名格式当是:___H_为保证唯一性,头文件的命名应该依据所在项目源代码树的全路径.例如,项目foo中的头文件foo/src/bar/baz.h可按如下方

2、式保护:#ifndefFOO_BAR_BAZ_H_#defineFOO_BAR_BAZ_H_…#endif//FOO_BAR_BAZ_H_1.2.头文件依赖Tip:能用前置声明的地方尽量不使用#include.当一个头文件被包含的同时也引入了新的依赖,一旦该头文件被修改,代码就会被重新编译.如果这个头文件又包含了其他头文件,这些头文件的任何改变都将导致所有包含了该头文件的代码被重新编译.因此,我们倾向于减少包含头文件,尤其是在头文件中包含头文件.使用前置声明可以显著减少需要包含的头文件数量. 举例说明:如果头文件中用到类File,但不需要访问File类的声明,头文件中只需前

3、置声明classFile;而无须#include"file/base/file.h".不允许访问类的定义的前提下,我们在一个头文件中能对类Foo做哪些操作?1.我们可以将数据成员类型声明为Foo*或Foo&.2.我们可以将函数参数/返回值的类型声明为Foo(但不能定义实现).3.我们可以将静态数据成员的类型声明为Foo,因为静态数据成员的定义在类定义之外.反之,如果你的类是Foo的子类,或者含有类型为Foo的非静态数据成员,则必须包含Foo所在的头文件.有时,使用指针成员(如果是scoped_ptr更好)替代对象成员的确是明智之选.然而,这会降低代码可读性及执行效率,因此如

4、果仅仅为了少包含头文件,还是不要这么做的好.当然.cc文件无论如何都需要所使用类的定义部分,自然也就会包含若干头文件.1.3.内联函数Tip:只有当函数只有10行甚至更少时才将其定义为内联函数.定义:当函数被声明为内联函数之后,编译器会将其内联展开,而不是按通常的函数调用机制进行调用.优点:当函数体比较小的时候,内联该函数可以令目标代码更加高效.对于存取函数以及其它函数体比较短,性能关键的函数,鼓励使用内联.缺点:滥用内联将导致程序变慢.内联可能使目标代码量或增或减,这取决于内联函数的大小.内联非常短小的存取函数通常会减少代码大小,但内联一个相当大的函数将戏剧性的增加代码大

5、小.现代处理器由于更好的利用了指令缓存,小巧的代码往往执行更快。结论:一个较为合理的经验准则是,不要内联超过10行的函数.谨慎对待析构函数,析构函数往往比其表面看起来要更长,因为有隐含的成员和基类析构函数被调用!另一个实用的经验准则:内联那些包含循环或switch语句的函数常常是得不偿失(除非在大多数情况下,这些循环或switch语句从不被执行).有些函数即使声明为内联的也不一定会被编译器内联,这点很重要;比如虚函数和递归函数就不会被正常内联.通常,递归函数不应该声明成内联函数.(YuleFox注:递归调用堆栈的展开并不像循环那么简单,比如递归层数在编译时可能是未知的,大多

6、数编译器都不支持内联递归函数).虚函数内联的主要原因则是想把它的函数体放在类定义内,为了图个方便,抑或是当作文档描述其行为,比如精短的存取函数.1.4.-inl.h文件Tip:复杂的内联函数的定义,应放在后缀名为-inl.h的头文件中.内联函数的定义必须放在头文件中,编译器才能在调用点内联展开定义.然而,实现代码理论上应该放在.cc文件中,我们不希望.h文件中有太多实现代码,除非在可读性和性能上有明显优势.如果内联函数的定义比较短小,逻辑比较简单,实现代码放在.h文件里没有任何问题.比如,存取函数的实现理所当然都应该放在类定义内.出于编写者和调用者的方便,较复杂的内联函数也

7、可以放到.h文件中,如果你觉得这样会使头文件显得笨重,也可以把它萃取到单独的-inl.h中.这样把实现和类定义分离开来,当需要时包含对应的-inl.h即可。-inl.h文件还可用于函数模板的定义.从而增强模板定义的可读性.别忘了-inl.h和其他头文件一样,也需要#define保护.1.5.函数参数的顺序Tip:定义函数时,参数顺序依次为:输入参数,然后是输出参数.C/C++函数参数分为输入参数,输出参数,和输入/输出参数三种.输入参数一般传值或传const引用,输出参数或输入/输出参数则是非-const指针.对参

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。