我已将我的大型程序分成多个.cpp文件,例如display.cpp,gui.cpp,display.h,gui.h等...
为了便于阅读,这些文件是分开的,不一定表示任何类型的依赖方案。
最初我在编译时遇到了很多麻烦,因为显示的函数会调用gui函数,反之亦然。无论我首先包括哪一个,它仍然取决于其他的功能。但我终于想出我需要首先包含所有.h文件,然后在我的主程序中包含所有.cpp文件。
示例,在main_program.cpp中:
#include "display.h"
#include "gui.h"
#include "display.cpp"
#include "gui.cpp"
不幸的是我也意识到为了编译我必须从Visual Studio调试器中被视为“源”代码的所有其他.cpp文件中删除。这样它只需编译main_program.cpp,包括其他文件。如果我在“源”侧栏中包含display.cpp和gui.cpp,则会出错。
这可能是错误的做事方式,我觉得我做错了。我希望能够将所有源文件放在侧边栏中并仍然进行编译。当然上面只是一个例子,我没有两个,但更像是10个不同的.cpp文件,它们都调用了彼此的功能。请告知如何更好地设计这个。
答案 0 :(得分:2)
您通常从不想要包含.cpp文件!此外,您应该习惯根据依赖性层次结构对代码进行分解,这些层次结构不应包含任何循环!对于小型proframs,这只是有用的,对于大型软件来说这是必不可少的。
答案 1 :(得分:1)
问题是你已经包含了.cpp
个文件,这就是为什么你必须告诉Visual Studio假装这些文件不是“源代码”的原因,因为它总是编译源代码文件。所以简单的解决方案是不要那样做。
根据需要在每个 .h
文件中仅包含头文件(.cpp
)就足够了。因此,例如,如果gui.cpp
需要调用display.cpp
中定义的函数,那么您应该#include
display.h
代码顶部的gui.cpp
头文件文件。
使用前向声明来消除任何延迟的循环依赖。
答案 2 :(得分:1)
那是......不是处理事情的正确方法。如果我不得不推测,我猜你没有使用不是定义的函数声明。您可能拥有函数定义:
void dothing(int param) { //function definition
throw param;
}
标题中的内容是函数声明,它将是这样的:
void dothing(int param); //function declaration
这只是让其他cpp文件知道该文件存在用于调用,但他们不需要知道详细信息。通常,函数将在您(似乎已)完成时放入.cpp文件中。每个函数都在头文件中有一个声明:
display.h
#include "velocity.h" //we need the details, so we include
void dothing(int param); //function declaration
class coordinate; // this is a class declaration
//this header needs to know about coordinates
//but doesn't need the details
//otherwise we'd have to include "coordinate.h"
struct object { //class definitions usually go in headers
coordinate* member; //pointers don't need to know the details
velocity speed; //actual object needs the details
float function(float param); //function declaration
};
display.cpp
void dothing(int param) { //function definition
throw param;
}
float object::function(float param) { //member function definition
}
然后,如果cpp文件无法访问另一个cpp文件中的函数,则它包含相应的标题:
的main.cpp
#include "display.h"
int main() {
object a;
a.function(3.4); //can call the member just fine
dothing(4); //it can call the function just fine.
}
请记住,标题应该更喜欢声明一个类(在我的示例中:coordinate
尽可能包含更多标题。还要记住模板完全不同的规则。
答案 3 :(得分:0)
之前我遇到过类似的问题,我有两个头文件相互引用,调用函数等。要修复它,我首先要确保我的所有标题保护都在检查中(#ifndef HEADER_DEFINE
,{ {1}}等等,然后在类文件中,我会包含有问题的标题。
e.g。如果我有Pie.h和Cherries.h,而Pie.h包含Cherries.h,反之亦然,那么在Pie.cpp文件中,我有Cherries.h的包含(反之亦然)。