我总是遇到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文件吗?
我无法在互联网上找到答案,也许我做错了问题......
答案 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:强>
答案 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
项目的方式。