有关c++分离式编译的问题

菜鸡的逆袭之路 2017-01-05 01:23:10
test.h

#pragma once
vector<string> loadFile(const string &filePath);

test.cpp

#include "test.h"
//...
vector<string> loadFile(const string &filePath)
{
string buf;
vector<string> svec;
ifstream in(filePath);
while (getline(in, buf)) {
svec.push_back(buf);
}
return svec;
}

main.cpp

#include"test.h"
//...
int main()
{
vector<string> svec = loadFile("D:/cpptest/1.txt");
for (auto &str : svec) {
cout << str << endl;
}
system("pause");
}

请高手详细讲一下分离式编译到底是什么原理?看了网上很多介绍感觉还是有一些不清楚(类文件的分离式编译和函数的分离式编译)为什么我同样的代码,如果直接在头文件中定义loadFile()函数,在test.cpp文件中什么都不写,在main.cpp中的写法不变,就导致了重定义的错误?
...全文
271 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yes-hyh 2017-01-05
  • 打赏
  • 举报
回复
引用 3 楼 qq_26761205 的回复:
[quote=引用 2 楼 heyuhang112 的回复:] 要理解这个的话,需要把编译、链接分开来想,c++的编译是以源文件为单位的。 可以理解成,编译是把c++语言翻译成机器码,仅仅只是语言上的翻译,每一个.cpp输出一个.o,此时仅仅只是翻译,对于每一个函数还没有确定最后他的偏移地址。 链接就将所有的.o组装成最终可执行文件,确定每一个函数的地址,然后确定最终的call 地址。 函数定义在头文件中,然后被多个源文件包含,在编译这些源文件时,会多次展开头文件,编译同一个函数,所以链接的时候会发现存在多个同样的函数,多以会报函数重定义错误。 若想将函数定义与头文件中,要么是模板函数,要么就要是内联函数(inline)
什么是“”导入“”、“包含”?还有如果在.cpp文件中定义函数和在.h中定义函数什么区别?倒数第二句话哪位老师再详细解释一下,新手还是有点迷糊... ...[/quote] 我没有说过“导入”这个词吧!“包含”就是include。 函数定义在头文件中和源文件中,本质上来讲的话,没有什么区别。如果头文件test.h只被一个源文件包含,那么你把函数定义在test.h中也没有错。但是如果被多个源文件包含就有问题了。 设想test.h中定义了函数void func(),test1.cpp和test2.cpp都include了test.h。 编译test1.cpp,展开test.h,有func()函数的定义,编译输出test1.o,test1.o中有func()函数。 编译test2.cpp,展开test.h,有func()函数的定义,编译输出test2.o,test2.o中有func()函数。 连接test1.o和test2.o,他们两个个里面都有func()函数,这是就产生函数重定义错误。 若还是不懂,可以看《程序员的自我修养》这本书,里面有详细介绍程序的编译链接。
  • 打赏
  • 举报
回复
老师们如果有讲的比较详细的参考资料可以直接发链接,谢谢啦
  • 打赏
  • 举报
回复
引用 2 楼 heyuhang112 的回复:
要理解这个的话,需要把编译、链接分开来想,c++的编译是以源文件为单位的。 可以理解成,编译是把c++语言翻译成机器码,仅仅只是语言上的翻译,每一个.cpp输出一个.o,此时仅仅只是翻译,对于每一个函数还没有确定最后他的偏移地址。 链接就将所有的.o组装成最终可执行文件,确定每一个函数的地址,然后确定最终的call 地址。 函数定义在头文件中,然后被多个源文件包含,在编译这些源文件时,会多次展开头文件,编译同一个函数,所以链接的时候会发现存在多个同样的函数,多以会报函数重定义错误。 若想将函数定义与头文件中,要么是模板函数,要么就要是内联函数(inline)
什么是“”导入“”、“包含”?还有如果在.cpp文件中定义函数和在.h中定义函数什么区别?倒数第二句话哪位老师再详细解释一下,新手还是有点迷糊... ...
yes-hyh 2017-01-05
  • 打赏
  • 举报
回复
要理解这个的话,需要把编译、链接分开来想,c++的编译是以源文件为单位的。 可以理解成,编译是把c++语言翻译成机器码,仅仅只是语言上的翻译,每一个.cpp输出一个.o,此时仅仅只是翻译,对于每一个函数还没有确定最后他的偏移地址。 链接就将所有的.o组装成最终可执行文件,确定每一个函数的地址,然后确定最终的call 地址。 函数定义在头文件中,然后被多个源文件包含,在编译这些源文件时,会多次展开头文件,编译同一个函数,所以链接的时候会发现存在多个同样的函数,多以会报函数重定义错误。 若想将函数定义与头文件中,要么是模板函数,要么就要是内联函数(inline)
幻夢之葉 2017-01-05
  • 打赏
  • 举报
回复
多个地方include了 #pragma once 只限定一个编译单元中仅仅导入一次,但是不限定多个地方包含

65,210

社区成员

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

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