关于标题,转发以及如何组织很多包含

时间:2011-11-11 18:55:04

标签: c++

我有3个类(可能是300个),每个类都有自己的标题和实现。 我想写一个'优雅'的方式来组织我加载三个中每个类所需的任何类的方式。也许这个例子有帮助...

我有:class1 class2 class3

每个标题都有:

#ifndef CLASS#_H 
#define CLASS#_H   
  #define FORWARD_STYLE
  #include "general.h"
 #endif

每个实施都有:

  #define DIRECT_STYLE
  #include "general.h"

行 我要编写一个'general.h'文件,其中包含:

#ifndef DIRECT_STYLE 
#ifndef CLASS1_H
#include "class1.h"
#endif
#ifndef CLASS2_H
#include "class2.h"
#endif
#ifndef CLASS3_H
#include "class3.h"
#endif
#endif

#ifndef FORWARD_STYLE 
class Class1;
class Class2;
class Class3;
#endif

// a lot of other elements needed 
#include <string.h>
#include <stdio.h"
....
#include <vector.h" 
( all the class I need now and in the future )

这是一个很好的结构?或者我正在做一些白痴的事情? 我的目标是有一个独特的'general.h'文件来写我需要的所有元素...... 这样可以正常工作吗? 感谢

3 个答案:

答案 0 :(得分:4)

现在这可能是个好主意,但不会扩展,应该避免。您的general.h文件将包含大量文件,因此包含它的所有文件将(a)由于内存限制而需要花费很长时间来编译或根本不编译;(b)每次都必须重新编译任何更改。

直接在每个文件中包含您需要的标头,并定义一些前向声明文件,您应该没问题。

答案 1 :(得分:4)

要遵循的基本规则是:

  1. 让每个源文件都包含以独立方式编译所需的所有头文件。避免让头文件通过其他文件间接包含在源文件中。
  2. 如果你有大多数源文件需要的构造,那么将它们放在一个公共标题中,并在那些需要它的源文件中包含 Only 标题。
  3. 尽可能使用前向声明。当您可以使用它们时有几个限制,请阅读 this 以了解有关这些方案的更多信息。
  4. 总的来说,避免在源文件中通过公共标头包含不必要的代码是一个好主意,因为它只会导致代码膨胀,所以尽量将其保持在最低限度。包含标题只是实际复制将整个标题粘贴到源文件中并包含不必要的文件有几个缺点,即:

    1. 增加编译时间
    2. 全球命名空间的污染。
    3. 预处理程序名称的潜在冲突。
    4. 增加二进制大小(在某些情况下,但并非总是如此)

答案 2 :(得分:0)

标题中的#define可能没问题,但它可以通过大量来源传播并可能导致问题。更严重的是,任何时候general.h或其任何包含都会改变整个项目的重建。对于小型项目,这不是问题,对于较大的项目,它将导致不可接受的构建时间。

相反,我使用了一些指导原则:

  • 在标题中,向前声明您可以使用标准库中显式或#include "blah_fwd.h"的内容。
  • 所有标题应该能够自己编译,而不是依赖包含早期内容的源文件。所有源文件都可以轻松检测到这一点,并始终首先包含自己的标题。
  • 在源文件中,包含您需要的内容(通常您无法使用源文件中的前向声明)。
  • 另请注意,永远不要在标头中使用using,因为它会污染全局命名空间。

如果这看起来像很多工作,不幸的是因为它是。这是一个从C继承的系统,需要一定程度的程序员维护。如果您希望能够在较高级别决定项目使用的是什么,并让编译器/运行时计算出来,那么C ++可能不是您项目的正确语言。