你能举几个例子说明在c ++中一个主要的cpp如何传递不同的cpp文件吗?
答案 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。
一个简单的例子可能是:
#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
#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;
}
#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)
你的意思是他们如何分享事物?
只需包含相同的标题即可。