我们在任何时候编写程序的时候,文件的组织一定要结构性,这样的项目文件,源码会给人一个良好的可读性。
我们都知道C++程序都是从main函数开始执行的,我们当然可以把所有代码都写在main函数里,或者main.cpp文件(main函数所在的cpp文件)中。但是,如果,自定义的函数很多的话就会使得main.cpp代码异常的臃肿,可读性非常的差,很不清晰。同时,也不利于对项目的调试。
这时候就考虑将一些代码有条理放在别的文件文件中,当然,我们可以放在.h文件中,但是通常来说,.h文件中一般只包含函数声明、宏定义、结构体定义等内容,即只放声明的原则。因此,一些函数的定义,我们只能放在其他.cpp文件中。这时候就有了问题:
我定义了main.cpp和test.cpp,我需要在main.cpp中调用test.cpp中定义的函数,可这时候报错了:错了:
1>main1.obj : error LNK2005: "void __cdecl test01(void)" (?test01@@YAXXZ) 已经在 test01.obj 中定义
1>C:\Users\liuliu\Desktop\cpp\test\Debug\test.exe : fatal error LNK1169: 找到一个或多个多重定义
重定义错误,可是我在main.cpp中分明没有定义test.cpp中的? 最后才明白,C程序中各个.cpp文件是单独编译,编译完毕最后连接到一起。当在编译main.cpp文件时,看到main.cpp文件中的#include“test.cpp”语句时时,就会把test.cpp中的内容和main.cpp放在一起编译,生成一个main.obj文件。但是,由于test.cpp文件也是.cpp文件也要单独编译,编译完test.cpp文件生成test.obj文件。最后将所有编译后的.obj文件连接到一生成可执行的.exe文件。这时就会发现test.obj中的内容main.obj中也有。所以会出现重复定义的错。 解决方法:不适用#include “test.cpp”,只需在main.cpp文件中对要使用的函数等用extern关键字进行明。
//main.cpp
#include <stdio.h>
extern void test01();
void main()
{
printf("hello\n");
test01();
}
//test.cpp
#include <stdio.h>
void test01()
{
printf("nihao\n");
}