繁体   English   中英

多源.cpp文件问题

[英]Multiple Source .cpp Files Problems

我已将大型程序分成多个.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文件,它们都调用彼此的函数。 请提供有关如何更好地设计的建议。

通常,您永远都不想包含.cpp文件! 同样,您应该习惯于根据不依赖任何循环的依赖关系层次结构对代码进行分解! 对于小型程序,这只是有帮助,对于大型软件,这是必不可少的。

问题在于您已经包含了.cpp文件,这就是为什么您必须告诉Visual Studio假装这些文件不是“源代码”的原因,因为它总是编译源代码文件。 因此,简单的解决方案是不要这样做

只需在每个 .cpp文件中仅包含头文件( .h )就足够了。 因此,例如,如果gui.cpp需要调用display.cpp定义的函数,则应在gui.cpp代码文件的顶部#include display.h头文件。

使用前向声明可以消除任何持久的循环依赖关系。

那是……处理问题的正确方法。 如果我不得不推测,我猜您不是在使用不是定义的函数声明。 函数定义可能是:

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以尽可能包含更多标头。还要记住,模板完全有完全不同的规则。

我之前遇到过类似的问题,在该问题中,我有两个相互引用,调用函数等的头文件。要解决此问题,我首先确保检查了所有头保护( #ifndef HEADER_DEFINE#pragma once等)。 ),然后在文件中添加出现问题的标头。

例如,如果我有Pie.h和Cherries.h,并且Pie.h包含Cherries.h,反之亦然,那么在Pie.cpp文件中,我具有Cherries.h的include(反之亦然)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM