在c ++上包含文件以避免循环依赖的确切方法

时间:2014-09-21 23:57:00

标签: c++ include g++

我总是遇到c ++问题,在设置新项目时,我花了更多的时间来尝试解决依赖关系,而不是编程。我在互联网上搜索一种自动执行此操作的方法,或者这样做的软件。事实上,我总是在geany上编程并使用shell脚本文件进行编译......

那么,有没有一个软件来管理这个? IDE会这样做吗?

我总是在main.cpp上包含.cpp文件,然后在这些.cpp上包含.hpp文件。所以,如果我有一个main.cpp,一个object.hpp和一个object.cpp,我将在main.cpp中包含object.cpp,在object.cpp中包含object.hpp。有没有更好的方法呢?

我可以只包含.hpp文件,并在构建脚本中添加每个.cpp文件吗?

我无法在互联网上找到答案,也许我做错了问题......

2 个答案:

答案 0 :(得分:3)

我找到了一个很好的article来处理包含文件。

所有c ++头文件的常见做法是简单地定义inclusion guards

#ifndef TEST_H
#define TEST_H

// class definitions goes here

#endif

如果存在某些循环依赖关系,请考虑forward declaration

每次包含此标头时,编译器会检查是否已经定义了符号TEST_H。这基本上保证了这个文件的内容只包含一次,因此在头文件中定义了类的单个声明。

很高兴知道,该指令“#include<>”复制并粘贴所包含文件的所有内容。

包含.cpp文件并不是严格禁止的,有时候选择不错,这被认为是一种不好的做法。正如我所提到的,包括文件,意味着文件的所有内容都在包含的位置被复制。对于带有包含保护的头文件,这没关系,但对于.cpp文件不好,因为这个文件中的每个函数定义都会重复。

在构建脚本中不包含文件意味着构建中只包含那些重复数据,否则最终会出现多个函数重定义错误。

如果您正在寻找IDE,请考虑:

IDE不会完成所有工作,但使用优质IDE可以显着提高工作效率。

<强> TLDR:

  • 使用包含警卫
  • 在构建脚本中包含所有.cpp文件。
  • 不要“#include”.cpp文件。
  • 在每个.cpp文件中,仅包含所需的标题,以减少编译时间。

答案 1 :(得分:0)

我通过良好做法看到了很多好的建议,但是您的错误(包括.cpp文件中的.cpp个文件)表明您错过了C / {{{{{{ 1}}构建过程,我希望一点解释可以帮助你更好地理解并避免错误。

C++个文件视为模块,将.c .cc .cxx .cpp文件视为一个模块,并使用实现的某些内容,.cpp只是标题,通常你不会不要将实现,但声明与多个模块共享。

通常将每个.h .hpp模块编译为二进制对象.cpp,然后(编译所有模块后)链接在一起g++ -c -o mymod1.o mymod1.cpp

即使您使用场景g++ -o myprog mymod1.o mymod2.o ...后面的单个命令g++ -o myprog mymod1.cpp mymod2.cpp进行编译和链接,也将每个模块作为单个对象处理。

我认为重要的是你要明白每个模块/对象都不知道其他人,如果你需要一些其他模块(g++)来了解main.cpp需要共享头文件mymod1.cpp.h .hpp),需要共享声明:模块全局变量,定义,枚举,函数原型或类声明,然后只在模块中包含mymod1.h (s)您想要使用mymod1.h实施的某些内容(mymod1)。

另外,你写的是你正在使用shell脚本来构建,如果你的项目文件很少,那就更好了,更好的是使用类似main.cpp的东西,学习如何使用它需要一些时间但是然后我敢打赌make有一些基于geany构建项目的工具,Makefiles是长期处理make / C项目的方式。