关于include <….cpp>小问题

小小攻城师 2009-10-30 11:10:31
在一个源文件中调用include <….cpp>的文件跟直接把他里面的内容复制过来有什么区别啊?
越详细越好 谢谢
...全文
627 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
小小攻城师 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cphj 的回复:]
你的问题是因为把#include的那个cpp包含到工程里面来了

如果#include了那个cpp,同时又把那个cpp包含到工程,链接时就会出现重定义错误

[/Quote]
能否给详细解释一下这个
我觉得这个是我的问题所在
期待楼下给解释一下
并且谢谢7楼
kiwigiving 2009-10-31
  • 打赏
  • 举报
回复
没有区别,这样用对于小程序没什么,大程序这样用,坏处多多~
sea_sharka_17 2009-10-31
  • 打赏
  • 举报
回复
在.cpp的文件中,使用#include<*.cpp>加入其它代码,或者把#include<*.cpp>这个文件的内容拷贝到.cpp中,就这两个方法来说结果是一样的。
但你的做法,不是上面的那个意思,你是把内容拷贝了一份,然后,又把#include<*.cpp>加入了。在一个工程中编译器,编译了两个相同的代码,你也应该会得出结论吧。。。
小小攻城师 2009-10-31
  • 打赏
  • 举报
回复
谢谢23楼的解释 我有点明白了
yizhili 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 huiguixian 的回复:]
我还是搞不懂
如果我真的想把一些函数写在别的文件里
然后我想把主函数写在一个文件里
然后在主函数里面调用别的函数
那应该如何来写呢?
[/Quote]

所谓 #include 的意思呢,就是把另一个文件里的东西复制到这里来,无论你的文件后缀是 h 还是 cpp 都是一样的
楼主的错误是怎么产生的呢?你可以试试写 a.cpp 和 b.cpp 两个文件,两个文件中有一模一样的两个函数,是不是产生了和你的问题中同样的错误?因为你有两个一模一样的函数,编译器不知道怎么区分它们了。
现在把 a.cpp 中的内容全部去掉,换成 #include "b.cpp",VC在编译的时候,首先将 #include "b.cpp" 替换成了 b.cpp 的内容,于是就和刚才的情形一致了。这时再进行编译,当然就会出一样的错误了。
那么 .h 文件为什么没有类似的问题呢?一是 .h 文件并没有定义,都是一些声明,声明可以重复多次(你只是在告诉编译器,工程中有这么个东西,具体在哪,请到别处找找),而定义不行。二是 VC 并不会编译 .h 文件,如果你把项目中的 .h 文件全部移除(不是删除!),程序照样可以编译。

回到楼主的问题,如果你要调用另一个 .cpp 文件中的函数,只要在使用它的文件中声明一下就可以了。比如:"int Foo( int a, int b );"(注意没有函数体) 这个声明告诉编译器你要一个名叫 Foo, 接受两个整型参数,返回整型的函数,编译器自动会帮你去找。只要项目中任一个 .cpp 文件定义了这样一个函数,编译器就可以找到。

现在,假设你有很多个函数,并且有很多个 .cpp 文件要用到它们,那么,岂不是需要在每个文件中写上一大堆的声明?这便是 #include 的用武之地了。在一个 .h 文件写上所有的声明,然后在每个 .cpp 文件中 #include 它,于是编译器就会把 #include "xx.h" 替换成 xx.h 文件中的实际内容,于是你的每个 .cpp 文件中都有这些声明了,都可以自由地使用这些函数了。
这不是鸭头 2009-10-31
  • 打赏
  • 举报
回复
1.h

cout<<"Hello world"<<endl;

2.cpp

#include <iostream>
using namespace std;

int main()
{
#include "1.h"
return 0;
}

#include就是类似于把代码直接复制的。
#include"XXX.cpp" //没有见过这种用法
小小攻城师 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cphj 的回复:]
你要做到的效果(分成2个cpp文件)没问题,但是方法用错了

#include一个cpp文件是不良风格,实际也容易导致重定义错误

那个帖子里面我写了正确的做法
[/Quote]
谢谢 我看到了 我已经结了那个帖子了
我期待高手给我讲解一下为什么我包含文件之后出现了
error lnk2005 ***已经定义在*.obj中……
我只在一个cpp中定义 然后在主函数所在文件#include<*.cpp>
为什么链接时出现已经定义的词
小小攻城师 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 starcat 的回复:]
引用 3 楼 steedhorse 的回复:
没区别。
但包含cpp文件很不专业。。。
呵呵,《数据结构教程》第3版,清华大学出版社
include "*.cpp"
void main()
在标准C代码中使用引用
俺都是在这本书里学的
[/Quote]
我就是看这本书上这么用我才学习在用
期待高手出现
woshiwangjincai 2009-10-31
  • 打赏
  • 举报
回复
恩,顶起
AiXed 2009-10-31
  • 打赏
  • 举报
回复
看高手扯淡
这不是鸭头 2009-10-31
  • 打赏
  • 举报
回复
没有区别,记得看过一段变态代码,就是用#include实现的类似直接复制的效果。
starcat 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 steedhorse 的回复:]
没区别。
但包含cpp文件很不专业。。。
[/Quote]呵呵,《数据结构教程》第3版,清华大学出版社
include "*.cpp"
void main()
在标准C代码中使用引用
俺都是在这本书里学的
cphj 2009-10-31
  • 打赏
  • 举报
回复
你要做到的效果(分成2个cpp文件)没问题,但是方法用错了

#include一个cpp文件是不良风格,实际也容易导致重定义错误

那个帖子里面我写了正确的做法
小小攻城师 2009-10-31
  • 打赏
  • 举报
回复
我还是搞不懂
如果我真的想把一些函数写在别的文件里
然后我想把主函数写在一个文件里
然后在主函数里面调用别的函数
那应该如何来写呢?
晨星 2009-10-31
  • 打赏
  • 举报
回复
当然,事情总有例外。如果涉及内联函数、模板等东西,事情就不完全一样了,这个楼主慢慢学习慢慢体会吧,都会明白的。
晨星 2009-10-31
  • 打赏
  • 举报
回复
你自己不都说了么,include跟拷贝内容没有区别。
于是,你包含了cpp文件的那个文件,跟被包含的那个.cpp文件本身就很有了重复的东西,而且很可能是定义性的(比如变量定义,函数定义等)。于是,当编译器把这两个.cpp分别编译成.obj并最重连接到一起的时候,连接器就会发现有的东西被重复定义了。

所以,C/C++语言通常的习惯是把定义性的东西都放.cpp文件中,而声明性的东西都放.h文件中,然后.cpp文件包含.h文件。原因就在于声明性的东西(比如函数原型声明,extern变量声明等)不管声明多少次都是没问题的,但定义不行。
jackyjkchen 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 huiguixian 的回复:]
可是为什么我包含文件之后出现了
error lnk2005 ***已经定义在*.obj中……
[/Quote]
不能重复包含的,头文件里有定义就是这个结果。
没事别包含cpp,即使是h文件也别放定义实现
cphj 2009-10-30
  • 打赏
  • 举报
回复
你的问题是因为把#include的那个cpp包含到工程里面来了

如果#include了那个cpp,同时又把那个cpp包含到工程,链接时就会出现重定义错误
小小攻城师 2009-10-30
  • 打赏
  • 举报
回复
可是为什么我包含文件之后出现了
error lnk2005 ***已经定义在*.obj中……
某某9 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 steedhorse 的回复:]
没区别。
但包含cpp文件很不专业。。。
[/Quote]恩
加载更多回复(4)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧