C++既然有头文件保护符机制,为何还不允许直接在头文件中实现类或者函数?

陆经渔 发布于 2013/08/15 15:11
阅读 2K+
收藏 0
如题,C++中头文件保护符机制使得同一个头文件可被同一个源文件反复包含而不会出现重复定义,那么我们为什么不能直接把头文件对应的实现文件直接整合到该头文件中?
加载中
0
刘地
刘地

C++不允许的,只允许重复声明,但不允许重复实现

然后标准库可以使用了条件宏

0
小耶果
小耶果
重复定义和实现,链接错误...
z
zmax
回复 @陈钊 : 可用 #ifndef #endif来避免重复,但是头文件中一般只是声明,定义在cpp文件中
陆经渔
陆经渔
呃,不同的源文件中包含同一个头文件(自带实现代码的那种)确实会导致重复定义的问题,想必这就是为什么不允许这么做的原因吧……不过好像记得C++ Primer上说过只要所有的定义都一样也是可以的???
0
oldpig
oldpig
可以直接把实现写在头文件里。boost就是这么干的。
陆经渔
陆经渔
莫非我的境界已经达到boost的高度了???
0
随便取个名字可以吗
随便取个名字可以吗

降低编译的耦合度。。

如果你把实现也放在头文件中,那么当你改动实现的时候,所有包含该头文件的源文件都要被重新编译。

陆经渔
陆经渔
嗯,有点靠谱
0
中山野鬼
中山野鬼
我倒。。。基础知识。。。啊。。会写 输出 hello world的代码时,就应该知道的。。。楼主先了解下 ,#include起什么作用,编译器针对什么文件进行编译,就清楚了。这方面c++和c是一个套路的。其实大多数其它高级语言,也这个套路,无非他们不告诉你而已。哈哈。
中山野鬼
中山野鬼
回复 @陈钊 : 你把#include 看作(其实就是这样),把后续文件内容插入到本文件当前位置,就理解了。
陆经渔
陆经渔
野鬼前辈,是不是不同的源文件中如果都包含同一个头文件(自带实现代码的那种)会导致重复定义的问题?不过好像记得C++ Primer上说过只要所有的定义都一样也是可以的???
0
随便取个名字可以吗
随便取个名字可以吗

引用来自“中山野鬼”的答案

我倒。。。基础知识。。。啊。。会写 输出 hello world的代码时,就应该知道的。。。楼主先了解下 ,#include起什么作用,编译器针对什么文件进行编译,就清楚了。这方面c++和c是一个套路的。其实大多数其它高级语言,也这个套路,无非他们不告诉你而已。哈哈。
说了等于没说。。。。
0
中山野鬼
中山野鬼

引用来自“随便取个名字可以吗”的答案

引用来自“中山野鬼”的答案

我倒。。。基础知识。。。啊。。会写 输出 hello world的代码时,就应该知道的。。。楼主先了解下 ,#include起什么作用,编译器针对什么文件进行编译,就清楚了。这方面c++和c是一个套路的。其实大多数其它高级语言,也这个套路,无非他们不告诉你而已。哈哈。
说了等于没说。。。。
有些事情,看似说了等于没说,其实什么都说了,只要自己去把资料看看,有些事情,什么都说了,结果等于没说,因为实际的原因仍然没有说清楚。
0
小耶果
小耶果
其实C或C++对于编译器来说是没有头文件这个概念的.从这方面来研究...
0
张亦俊
张亦俊

引用来自“中山野鬼”的答案

引用来自“随便取个名字可以吗”的答案

引用来自“中山野鬼”的答案

我倒。。。基础知识。。。啊。。会写 输出 hello world的代码时,就应该知道的。。。楼主先了解下 ,#include起什么作用,编译器针对什么文件进行编译,就清楚了。这方面c++和c是一个套路的。其实大多数其它高级语言,也这个套路,无非他们不告诉你而已。哈哈。
说了等于没说。。。。
有些事情,看似说了等于没说,其实什么都说了,只要自己去把资料看看,有些事情,什么都说了,结果等于没说,因为实际的原因仍然没有说清楚。

野鬼其实说得很准了,我来补充个实践的方法。编译器都可以生成预处理之后的代码输出到文件的,看看编译器的帮助文档就能知道做法了。如果你用的是VS(VC)的话,在项目配置里应该是可以设置。这样就可以看到预处理之后的代码了。我觉得,看到预处理之后的代码,再看看野鬼说的,应该就明白#include是干啥的了(注意,不要去#include一些stdio之类的.h,只要#include自己写的.h文件就好,那些.h内容太多了)。

0
chunquedong
chunquedong

引用来自“刘地”的答案

C++不允许的,只允许重复声明,但不允许重复实现

然后标准库可以使用了条件宏

一、二楼说的都对,给你总结一下:

  • 函数允许重复声明,但不允许重复实现。(宏好像不允许重复定义,变量是否允许重复定义可能有编译器实现有关)
  • 重复实现是个链接错误。(之所以有些没有链接错误,是因为编译器内联,但是内联搞法会导致生成文件大小成倍增长。)

返回顶部
顶部