多源.cpp文件问题

时间:2012-03-23 17:31:05

标签: c++ visual-studio-2010 visual-c++ include

我已将我的大型程序分成多个.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文件,它们都调用了彼此的功能。请告知如何更好地设计这个。

4 个答案:

答案 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的包含(反之亦然)。