可以有多个CPP,但CPP的名字不能相同,因为编译的OBJ的文件是以CPP为单位。
不同CPP文件的函数可以通过声明的方式使用,通常声明放在H文件里,而想引用其它CPP文件的变量可以使用extern 这个也通常放在H文件
通过#include的方式加载
可以有多个.cpp, 甚至是多个.cpp,.c混合都是没有问题的,多个cpp时最好使用预编译头,也是就建立console工程的时候不选空工程,简单例程或HELLO WORLD程序,自己添加cpp代码文件时,确保在文件的头部写上#include 就可以了
------解决方案--------------------------------------------------------
每个.cpp文件作为一个编译单元,被编译成一个目标文件(.obj),它用目标语言来描述.cpp的内容。然后,用一个链接器将所有的目标文件链接起来,形成一个.exe文件。
换句话说,在第一阶段,每个.cpp都是独立编译的,互不干涉(当然可以使用公用的.h文件)。在最后链接时才归并在一起。所有在.exe中的实际地址,都是在链接时生成的。
比如说,a.cpp中调用了一个函数fun(),b.cpp中实现了函数fun()。
那么a.cpp编译成a.o时,会建立一个地址表,一种有一项 a_fun_address,用于调用函数fun()时的跳转地址。但是,这个地址在a.o中是不知道的,因此它声明需要这个地址,然后在调用fun()初写:
call [a_fun_address] // 此处是调用fun的伪目标语言
而b.o中则从它的b_fun_address处开始写fun的实现。
如:
b_fun_address:
XXXX // 此处是实现fun的伪目标语言
然后在链接时,链接器将fun的实现(b_fun_address开始的目标代码)确定到某个地址上,并将这个地址回写到a_fun_address上。从而完成a中的调用。
全局/静态的结构(以及对象)也是类似的方法。类的函数则使用和函数相同的方法。(换句话说,在编译完成时,目标代码中没有类的概念了,而是拆成了函数和仅带成员变量的结构)。
以上只是C++编译的一种常用方式,也可以使用其他的方式(比如早期的C++编译器是把C++代码编译成等效的C代码,即不用链接,然后依靠C编译器完成进一步编译和链接的工作)。对C/C++而言,在编译之前还要进行预编译,也是不可或缺的一个步骤。