c++ - 我将如何处理大量的头文件?

标签 c++ include header-files organization

在我编写程序的过程中,我已经有了大约 30 多个头文件。

当我开始时,我有一个一体化的 header ,它链接到我最新制作的所有 header 文件,以及我需要的项目库。

使用这种格式,我不得不花费 5 分钟以上的时间才能通过更改变量名或其他同样小的名称来重新编译整个程序。

我之前的计划是为我的所有标题制作一个“层列表”,其中最基本的标题位于底部,下一级标题需要这些,依此类推,直到我到达 main.cpp 文件. (第 2 层需要第 1 层中最高的,依此类推)。有了这个想法后,我最终转而制作文件夹组,并拥有一个 Folder.hpp 文件,以备我需要该目录中的所有内容时使用。

现在在编译时,当 include 命令就在我面前时,我立即被语法错误淹没了,说没有正确包含任何内容。

根据其中一个语法错误,这里是一些 header :

===Character.hpp===
#include "../../Pre.hpp"
#include "../Assets/Folder.hpp"
#include "../Control/Folder.hpp"
#include "../WorldObj.hpp"

===Control/Folder.hpp===
#include "CommonStat.hpp"
#include "DeathHandler.hpp"
#include "EnergySys.hpp"
#include "FactionHandler.hpp"
#include "Interaction.hpp"
#include "Warper.hpp"
#include "WeaponPos.hpp"

===WeaponPos.hpp===

struct WeaponPos{};
===Build Message===
Build Message: error: 'WeaponPos' does not name a type

===NOTE===
The #include lines are the only (seemingly) important portions of the code. the 'struct WeaponPos' is only to show where it is located in terms of the syntax error.

WeaponPos myWpnPos 是 Character 的一个变量 忘记包含那个注释了。

什么是正确有效地组织头文件以便在编译源文件时它们都负责的好方法?

我正在使用 Code::Blocks和 Windows 7 64 位上的 MinGW GCC 4.7。

最佳答案

这决不能解决您的全部问题,但值得知道它的存在并且它实际上可能有助于您 future 的设计决策。

处理由小更改引起的长时间重新编译的方法之一是 PIMPL idion - 一般的想法是拥有一个包含类的所有私有(private)成员的单独结构。该结构在头文件中向前声明并在类的 cpp 文件中定义。因此,当您在私有(private)结构中添加/重命名字段时, header 根本不会更改,因此不必重新编译链接到它的其他 header 。

Much better description with examples

另一个重点是不要创建包含标题的级别 - 应该只在真正需要时才包含标题。前向声明就是一个很好的例子。如果您将 Class1 作为 Class2 中的指针成员,则不必在 Class2.h 中实际包含 Class1.h - 通常转发声明 Class1 然后将 header 包含在 Class2.cpp 文件中 - 这减少了大大重新编译。

总结:

  • 使用 PIMPL
  • 尽可能转发声明并包含在 cpp 中
  • 不需要时不要包含

关于c++ - 我将如何处理大量的头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26321217/

相关文章:

c - 在自定义函数中再次包含相同的头文件,哪些已经包含在主程序中?

c++ - 包含 "flint.h"或 "flint/flint.h"是更好的做法

C - Xcode 中的重定义错误

php - 在另一个 php 文件 wordpress 插件中包含一个 php 文件

c++ - 程序编译但未运行c++

c++ - 如何将模板函数作为模板函数的参数传递?

c++ - 使用 Windows API 处理 txt 文件的内容

java - 如何将来自不同目录的页面包含在 WEB_INF 中

c - 包含另一个 .h 文件只能看到我的结构,但看不到我的函数

c++ - range-v3 连接函数将两个容器连接在一起