代码之家  ›  专栏  ›  技术社区  ›  Rob

如何组织STL头文件?

  •  10
  • Rob  · 技术社区  · 16 年前

    我正在研究一个使用STL的大型项目,并对您组织STL的首选方式有疑问。 #includes .

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

    第一个方法的优点是.cpp文件是独立的单元,可以在不同的项目中使用,而不必担心缺少 #include . 第二种方法的优点是,您可以使用编译器预编译头支持,还可以包装stl 包括: 在里面 pragmas 禁用某些警告(例如,在4级编译时,某些boost头将导致警告)。

    你喜欢用哪一种?

    4 回复  |  直到 16 年前
        1
  •  15
  •   Pieter    16 年前

    我只包含每个源中真正需要的头文件,而不是“全部捕获”头文件,以尽可能减少依赖项(以及编译时间)。

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

    因为预编译头是编译器特有的东西。在我看来,优化/更改预编译头不应影响代码的正确运行。

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

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

        2
  •  2
  •   anon6439    16 年前

    我要做的是在我的单曲中包含整个项目中需要的所有STL头文件 precompiled header 通常是默认的stdafx.h。预编译头实际上是在项目中首先要设置的内容,包括所有stl-/boost-/platform头和第三方库。

    stl&boost整齐地排列在名称空间中,因此它们也不会导致任何混淆或重叠。

    在头文件中,我通常使用全名,但在源文件中使用 使用命名空间X 在适当的时候。

        3
  •  2
  •   peterchen    16 年前

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

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

    .cpp文件仍然需要包含“stdafx.h”,因此其独立性存在争议。但是,依赖关系是明确的状态,移除stdafx.h include比查找所有缺少的include简单。另外,标准的报头——所有报头都应该——确保它们不会包括两次。


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


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

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

        4
  •  1
  •   Rob Wells    16 年前

    完全同意John Lakos的书《大规模C++设计》的建议。

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

    拥有一个大的头文件清单,所有的包括增加了不必要的依赖性,使设计非常脆弱。

    哦,还有一件事就是头文件中永远没有using声明。只在实现文件.cpp文件中使用它们。

    Hth.

    干杯,

    抢劫