include.cpp(main函数的cpp文件)文件中包含另一个.cpp文件的错误及原因

当一个main函数的cpp文件包含另一个cpp文件,使用#include "data.cpp"  是不可以的,例如下面

include.cpp

#include 
#include "data.cpp"
//extern void add();
void main() {

	#include "include.h"
	#include "yingcheng.itcast"
	add();
	getchar();

}

 

data.cpp 文件

#include "data.h"
#include 
void add() {

	int c = a + b;
	printf("\n");
	printf("%d", c);

}

data.h

#pragma once
int a = 10;
int b = 20;
int c;

yingcheng.itcast

#pragma once
printf("俞文龙真是牛,跟着龙哥学c在也不用担心c学不会");

include.h

#pragma once
printf("jajklsjklsdjkjskljdsadf");

这是我们使用了#include "data.cpp"  这样包含一个cpp文件会发现报错,竟然编译不通过

include.cpp(main函数的cpp文件)文件中包含另一个.cpp文件的错误及原因_第1张图片

 

于是我就查阅了往事的资料,网上资料是这样说的cpp文件是独自编译的。举例如下

因为在工程编译的时候各个.cpp文件依次单独编译,最后才连接到一起,当在编译include.cpp文件时,看到include.cpp文件中有#include "data.cpp" 文件时就把data.cpp中的内容和include.cpp一起编译生成include.obj文件。别忘了data.cpp文件也是.cpp文件也要单独编译,编译完data.cpp文件生成data.obj文件后。再将所有编译后的.obj文件连接到一生成.exe文件。这时就会发现data.obj中的内容data.obj中也有(因为include.cpp中 #include"ata.cpp")。所以会出现重复定义的错误。

这时你可能又会想到把data.cpp文件改名为data.h在include.cpp文件中#include "data.h" 不就行了。因为.h文件不会单独编译。确实是这样。将data.cpp改为data.h后不管工程目录中有没有添加data.h文件都可以。可是前面说了.h文件中最好只放声明。

总结一下:要想把自己实现的函数放到同一个文件中调用,如果放在.h文件中违背了.h文件最好只放声明的原则。如果放在.cpp文件中在include.cpp中 #include相应的.cpp文件则不能将这个.cpp文件添加到工程目录下,这样看起来又不像是一个整体(凭什么哪个.cpp文件就不能出现在工程目录下)

到底是不是这样我们也不知道,具体的解决方案是什么?答案是extern   

extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示变压器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。
关于extern更详细的解释请看百度百科 所以我们只需这样:如果在include.cpp中要调用data.cpp中的函数,不要在include.cpp中#include "data.cpp" ,只需在include.cpp中声明一下要调用的函数,并且声明前加关键字extern

废话不多说,下面我就试一把,修改代码如下:

#include 

extern void add();
void main() {

	#include "include.h"
	#include "yingcheng.itcast"
	add();
	getchar();

}

编译成功

include.cpp(main函数的cpp文件)文件中包含另一个.cpp文件的错误及原因_第2张图片

 

输出结果:

include.cpp(main函数的cpp文件)文件中包含另一个.cpp文件的错误及原因_第3张图片

好了,关于cpp文件引入另一个cpp文件报错讲解结束,如果你觉得我写的可以请关注我的博客

你可能感兴趣的:(C语言)