你如何组织STL标题?

时间:2008-11-12 09:50:04

标签: c++ stl include

我正在开发一个使用STL的大型项目,并对您组织STL #includes的首选方式提出疑问。

  • 您更喜欢#include使用它的源文件中的每个标头。例如,如果foo.cppbar.cpp都需要std::string,则两者都会#include <string>
  • 您是否希望拥有一个包含项目使用的所有STL标头的头文件(即将它们添加到MS'stdafx.h'预编译标头中)。

第一种方法的优点是.cpp文件是一个独立的单元,可以在不同的项目中使用,而不必担心你错过#include。第二种方法的优点是你可以使用你的编译器预编译头支持加上你可以在#includes中包含禁用某些警告的STL pragmas(例如,一些Boost头会在以下情况下引发警告在第4级编译。

您更喜欢使用哪种?

4 个答案:

答案 0 :(得分:15)

我只包含每个源中真正需要的头文件,而不是'catch all'头文件,以保持依赖关系(以及编译时间)尽可能低。

预编译头文件无论如何都可以工作(即我依赖预编译头文件来加速编译过程,而不是获取声明)。因此,即使通过包含的预编译头文件声明了某些内容,我仍然会包含“常规”标头,它将被包含保护机制跳过,并且不会在编译时添加任何重要内容。

由于预编译头是编译器特定的东西。在我看来,优化/更改预编译头文件对代码的正确运行没有任何影响。

让依赖关系尽可能低的主要优点是重构变得更容易(或者更确切地说:可行)

关于这一切的好书是Large Scale C++ Design from Lakos

答案 1 :(得分:2)

我所做的是在我的单precompiled header中包含我在整个项目中需要的所有STL标题,通常是默认的StdAfx.h。预编译头是事实上在项目中设置的第一件事,包括所有STL- / boost- / platform头和第三方库。

STL&amp; boost在命名空间中整齐排列,因此它们不会引起任何混淆或重叠。

在标题中,我通常使用全名,但在源文件中,在适当的时候使用命名空间x

答案 2 :(得分:2)

您可以将这两种方法结合起来:

同时包含两个.cpp文件,并将其添加到stdafx.h中。这仍然会为您提供PCH优化。

.cpp - 文件仍然需要#include“stdafx.h”,因此它的独立性值得商榷。但是,依赖关系是明确的状态,删除stdafx.h include比查找所有缺少的包含更简单。此外,标准标题 - 如所有标题应该 - 确保它们不包含两次。


通常,我同意你使每个文件“独立”的方法,即当.cpp被添加到另一个项目或者包含.h时,它会处理它的依赖关系。


请记住,PCH是一种权衡,它们可以变得巨大。 PCH中的大部分未使用的代码实际上可能会降低您的构建速度。快速磁盘有很多帮助,但是:)

另外请注意,在MSVC中至少在某些版本中启用预编译头实际上会改变处理:#include“stdafx.h”之前的声明被忽略,因此这需要是您的第一个非注释语句。丑陋的陷阱。

答案 3 :(得分:1)

完全赞同John Lakos的书“大规模C ++设计”的建议。

声明文件本身所需的文件所需的所有标头,无论是.h还是.cpp。不要依赖其他头文件包含的文件的副作用。

列出所有包含的大型头文件会不必要地增加依赖性并使设计变得非常脆弱。

哦,另一件事从来没有在头文件中使用声明。只能在实现文件中使用它们.cpp文件。

HTH。

欢呼声,

罗布