在《google c++ style guide》编程规范中,其中提到头函数最小包含的问题,这里细说一下我在项目遇到的坑,以及对最小包含的理解。
何为头函数最小包含?具体的说就是:在一个头函数中,当一个前置声明足够时,不要使用#include,不适用命名空间(using namespace)。
基本说来,在头函数中,可以使用#include的情况大概有这么几种:
1,头文件中用到的基础库类,如 #include <vector>, #include <map>
2,头函数中继承的父类,如 #include "Strategy.h"
3,不涉及宏,非通用模块的结构体定义类, 如 #include "def.h"
4,封装的、使用的非常成熟的基础类,(不建议)如: #include "base/string_util.h"
总而言之,除了1,2情况外,其他两种能够少用#include,尽量少用,否则你程序明明没错,但是经常会遇到:expected primary-expression ...... ,expected unqualified-id......等等等等一系列莫名其妙的错误。而且这种问题往往要从一个文件,追到另一个文件,再从一个文件,追到另一个文件,往往要精疲力尽地找上个十万八千里才能发现问题在哪。而且编译缓慢,每一次编译都要重新编译头文件中所有的文件。
避免的方法:
在头文件中,只申明,不具体构造。
e.x. class StringHandler;
scoped_ptr string_handler_<StringHandler>;
在具体的cc文件中,再具体的构造:
string_handler_.reset(new StringHandler());
在具体的函数参数传递时,尽量使用引用和指针,这样不仅可以最小包含,还能提高运行效率(类参数传递时,不需要调用类的拷贝构造函数)
e.x. void Function_Do(const MyClass& in, MyClass* out);
以上,个人无聊总结,希望对大家有用。