include.cpp(main函数的cpp文件)文件中包含另一个.cpp文件的错误及原因
当一个main函数的cpp文件包含另一个cpp文件,使用#include "data.cpp" 是不可以的,例如下面
include.cpp
#include <stdio.h> #include "data.cpp" //extern void add(); void main() {#include "include.h"#include "yingcheng.itcast"add();getchar();}
data.cpp 文件
#include "data.h" #include <stdio.h> 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文件会发现报错,竟然编译不通过
于是我就查阅了往事的资料,网上资料是这样说的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 <stdio.h>extern void add(); void main() {#include "include.h"#include "yingcheng.itcast"add();getchar();}编译成功
输出结果:
好了,关于cpp文件引入另一个cpp文件报错讲解结束,如果你觉得我写的可以请关注我的博客
总结
以上是生活随笔为你收集整理的include.cpp(main函数的cpp文件)文件中包含另一个.cpp文件的错误及原因的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Word2Vec学习笔记(五)——Neg
- 下一篇: hdu1754(简单线段树)