在一个项目中创建许多cpp文件

时间:2010-09-16 21:21:50

标签: c++

你能举几个例子说明在c ++中一个主要的cpp如何传递不同的cpp文件吗?

4 个答案:

答案 0 :(得分:14)

在比简单的Hello World更大的项目中,编写更多的.cpp(技术上称为“翻译单元”),逻辑上分离应用程序的各个部分并减少编译时间。

请注意,不同的cpp文件没有合并在一个主.cpp中(我想你从你的问题中思考),但是每个.cpp都是自己编译的;编译器为每个.cpp生成一个对象模块(通常是.o或.obj),然后调用链接器将这些模块链接在一起以生成最终的可执行文件。

如何使这项工作?在手动调用编译器的小项目中,您可以只调用编译器在命令行中指定所有.cpps并让它重新编译所有内容并自行调用链接器。

当程序变大时,通常只委托在修改后的文件上调用编译器的任务,然后将链接器运行到某种实用程序:很多人使用Makefile,很多人只使用管理所有文件的IDE一个项目,只需按一个按钮就可以自动调用编译器和链接器。实际上,在不同的步骤中手动调用编译器和链接器是非常罕见的。

为了使各种模块之间的通信成为可能,C ++允许使用prototypes / extern声明(通常在头文件中完成)声明函数/类/变量,而不在实际中定义它们。现翻译单位。这使编译器可以检查语法并发出过程调用的代码,并指示链接器在其他对象模块中查找这些“缺失的部分”。

通常做的是将每个.cpp与.hpp(或.h,如果你是老式的:) :)标题相关联,该标题包含相对于其.cpp的所有原型和声明,应该可以从另一个访问模块。这样,如果A.cpp需要调用B.cpp中定义的函数,它可以简单地包含B.h。

一个简单的例子可能是:

A.hpp

#ifndef A_CPP_INCLUDED
#define A_CPP_INCLUDED
// ^^^ these are header guards, used to avoid multiple inclusions of the same header    

// Declarations

// Notice that this does not define a global variable, it just says to the compiler "in some module there's a global named in this way, let me access it"
extern int AUselessGlobalVar;
int AddFive(int In);

#endif

A.cpp

#include "A.hpp" //it's useful that each .cpp includes its own .hpp, so it has all the prototypes already in place

// Actually define the var
int AUselessGlobalVar;

// Actually define the function
int AddFive(int In)
{
    return In + 5;
}

Main.cpp的

#include <iostream>

#include "A.h" // now it can access all the functions/vars declared in A.h

int main()
{
    std::cin>>AUselessGlobalVar;
    std::cout<<AddFive(AUselessGlobalVar);
    return 0;
}

顺便说一句,在这个博客文章中,链接的经典模型有a nice description,这与我们所谈论的内容非常相关。

答案 1 :(得分:1)

几个.cpp文件将共享一个共同的.h(标头)文件。在标题中,他们需要分享所有内容,例如:函数原型,宏,常量,......

我希望你问的是这个。

答案 2 :(得分:1)

假设您有“主”CPP文件,它将包含您的main()函数,一个执行某些操作的CPP文件,以及一个声明该内容的头文件:

main.cpp中:

#include "stuff.h"
#include <iostream>

int main() {
    cout << do_something(5) << endl;
}

stuff.h:

int do_something(int);

stuff.cpp:

#include "stuff.h"

int do_something(int x) {
    return x*x;
}

如果您使用的是像QtCreator或Visual Studio这样的IDE,则不必做任何特别的事情。

如果您使用命令行,现在需要让它知道这些额外文件的位置。例如,使用GCC:

g++ main.cpp stuff.cpp -o the_program_name

(假设您的头文件与CPP文件位于同一目录中)

现在,程序将写入标准输出25,因为它正在调用do_something

中的stuff.cpp函数

答案 3 :(得分:0)

你的意思是他们如何分享事物?

只需包含相同的标题即可。