标签:架构设计
经验告诉我们,某些编码实践虽然在C++中完全合法,但是绝对不能应用于大型项目环境中。 大型项目环境下必须有适当的约束,否则很容易变得难以控制并很难维护(摘自<<大规模C++程序设计>>)。下面以Chromium中运用的两个Coding Style中定义的头文件顺序为例。
WebKit/Blink遵循业界标准的定义,其实也是Lakos在<<大规模C++程序设计>>中建议的顺序 :
(Blink特殊的一点是编译单元必须先包含config.h。)
这样做的目的是为避免隐性依赖。每个头文件都应当做到自包含(Self-Contained, or Self Sufficient), 这样保证用户能直接头文件中理解它的物理依赖。如果遵循这个顺序,当出现隐性依赖时,是无法编译通过的。
下面这个例子:
my_class.h中依赖了std::string, 但没有显式的包含,当main里先包含标准库的头文件string时,编译是不会出错的。
main.cc
#include <string> #include <iostream> #include "my_class.h" int main(int argc, char* argv[]) { MyClass aInstance; std::cout << aInstance.value() << std::endl; }
#ifndef MY_CLASS_H_ #define MY_CLASS_H_ class MyClass { public: MyClass(); const std::string& value(); private: std::string value_; }; #endif
In file included from main.cc:1: ./my_class.h:6:9: error: use of undeclared identifier ‘std‘ const std::string& value();
#include "my_class.h" #include <string> MyClass::MyClass() :value_("Hello!") { }
In file included from my_class.cc:1: ./my_class.h:6:9: error: use of undeclared identifier ‘std‘ const std::string& value();
Self-sufficient header files in C/C++
Headers and Includes: Why and How
C/C++ include file order/best practices
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:架构设计
原文地址:http://blog.csdn.net/horkychen/article/details/46810943