解读Google C++编码规范 – 头文件(1)

我认为通过学习一份好的编码规范可以深入的去了解一门语言的一些特性(《通过编码规范来学习一门编程语言》)。我的想法是对Google C++编码规范进行翻译,通过翻译的这个过程去复习、学习C++中的一些重要的知识点和特性。

Google的C++ 编码规范据称是地球上最好的C++编码规范,没有之一。姑且不去深究Google的C++编码规范是否为天下第一,但是至少是这种开放的精神很值得表扬。目前这份C++编码规范的中英文版网上都能够很方便的找到:


Google 官方英文版: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

中文翻译版:http://codinn.com/projects/google-cpp-styleguide/view/


我的翻译不可能那么专业,仅仅是为了学习C++而进行的行为,同时在译文中会对一些C++的知识点进行回顾从而帮助学习C++。

[分割线]


1. 头文件

一般来说,每一个.cc文件都应该有对应的.h文件。但是也有一些例外,比如说单元测试和一些只有main()函数的小的.cc文件。

是否正确使用头文件对你代码的可读性、大小、和性能会产生很大的影响。下面的一些规则会帮助你避免一些在使用头文件中可能会犯的一些错误。

1.1 #define 保护

所有的头文件都应该有#define保护

[cpp] #ifnef FOO_BAR_BAZ_H_ #define FOO_BAR_BAZ_H_ ... #endif [/cpp]

 

1.2 头文件依赖

 

如果前向声明就足够用的话,不要再头文件中使用#include包含其它头文件。

 

当你在包含头文件时,你就建立了一种了依赖关系;这个依赖关系将会导致每次头文件有变动的时候你的代码都会被重新编译。如果说你的头文件中包含了其他头文件,这就会导致任何被包含的头文件有变动时,所有被包含你这个头文件的代码也同样会被重新编译。因此,我们更倾向于用最少的头文件包含,特别是在头文件中包含另一个头文件。

你可以利用前向包含的的声明方法来很大程度上减少在你的头文件中需要包含的头文件。比如说,你的头文件用到了File类,但是你不需要访问File类的定义。这种情况,你只需要在头文件中前向声明class File而不需要将头文件包含进来(#include “file/base/file.h”)。

我们怎样才能在头文件里用Foo类而不去访问它的定义?

 

  • 我们可以声明数据成员为指针类型Foo* 或 Foo&;
  • 我们可以声明(但不定义)函数的返回值或/和参数为Foo。(有一个例外,如果Foo或const Foo&有一个非显示定义的带一个参数的构造函数,这种情况下我们就需要完整的定义特哦支持自动类型转换);
  • 我们可以声明Foo类型的静态数据成员。因为静态数据成员是不包含在类的定义中的。

 

除了这些情况以外,如果你的类是Foo的子类或者有一个Foo的成员类型,那么你就必须包含Foo的头文件。

有一些时候,声明指针成员(scoped_ptr更好)比声明对性成员要好。但是,这种复杂的代码会降低代码的可读性和效率,所以如果你仅仅是为了减少头文件中的包好就不要声明为指针。当然,.cc文件应该需要他们用到的类的定义,而且一般需要包含多个头文件。

注意事项:如果你的你的源文件中使用了Foo符号,不过你是用头文件的方式或者前段定义的方式,你都应该自己将这个类的定义包含进来, 而不是依靠头文件将这个类包含进类。有一个例外,如果说Foo在myfile.cc中被使用,那么在myfile.h中包含(或者前段定义)而不再myfile.cc中包含是没问题的。

 

 

posted @   imjustice  阅读(658)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示