2014-09-21 115 views
0

我总是在C++上遇到问题,我花更多时间在设置新项目时尝试解决依赖关系而不是编程。我在互联网上搜索自动执行此操作的方法或执行此操作的软件。实际上,我总是编写geany并用shell脚本文件编译...在C++上包含文件的最终方法避免循环依赖关系

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

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

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

我只是不能在互联网上找到了答案,也许我做了错误的问题...

+5

'我总是在我的main.cpp中包含.cpp文件 - 错误!只包含头文件并分别构建每个源文件。 – 2014-09-22 00:00:52

+0

与@NeilKirk达成协议。请打破'#inc'-''.cpp'文件的习惯。 – jxh 2014-09-22 00:54:20

+0

@NeilKirk,并说“分别构建每个源文件”,你的意思是做类似于:g ++ main.cpp object.cpp -o main? – Mete 2014-09-22 12:12:09

回答

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文件中,只包含需要的标头,以减少编译时间。
+0

它有一些理由同时使用包括守卫和编译指示。可以通过一次了解编译指示的编译器加快速度。 – Paladin 2015-04-02 06:04:56

0

我看到很多好的做法,但你的错误(包括从.cpp文件.cpp文件),建议你错过了一些概念在C/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 .hppmymod1.h)与声明需要共享:模块全局变量,定义,枚举,函数原型或类声明,然后在需要使用mymod1实现(main.cpp)的模块中包含mymod1.h

此外,你写你使用的是一个shell脚本来建立,没关系,如果你的项目是很少的文件,更好的是使用像make,学习如何使用它需要一些时间,但然后我敢打赌geany有一些基于Makefilesmake建设项目的设施是长期处理C/C++项目的方式。