C++类成员函数定义在类体内为什么不会报重定义错误

恋喵大鲤鱼
博客专家认证
2016-08-18 01:11:24
C++类成员函数定义在类体内为什么不会报重定义错误。类成员函数定义在类体内,并随着类的定义放在头文件中,当被不同的源文件包含,那么每个源文件都应该包含了类成员函数的实体,为何在链接的过程中不会报函数的重定义错误呢?如果是因为定义在类体内的成员函数被编译器内联处理,但听说并不是所有的成员函数都会被内联处理,比如包含递归的成员函数。

实际测试,不会报重定义错误,为什么会这样,我哪里理解错误了吗,请指教,谢谢!
...全文
488 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
RajiDog 2019-03-12
  • 打赏
  • 举报
回复
1.条件编译仅保证不发生编译时重定义 2.类定义在头文件,不会发生链接时重定义错误:因为,它不像定义在头文件的全局变量一样会全局链接。其是局部链接,即只在当前编译单元有效。 3.类的往往是在同一编译单元中发生编译时重定义,如a.h,b.h都有类A (声明或定义),某个编译单元内同时包含着两个头文件,则会在编译该单元时,发生重定义。
恋喵大鲤鱼 2019-03-12
  • 打赏
  • 举报
回复
在阅读《程序员的自我修养》中已经弄明白了,具体参考博文:https://dablelv.blog.csdn.net/article/details/52065524
恋喵大鲤鱼 2016-08-19
  • 打赏
  • 举报
回复
引用 7 楼 bluewanderer 的回复:
[quote=引用 5 楼 K346K346 的回复:] [quote=引用 3 楼 K346K346 的回复:] [quote=引用 1 楼 fefe82 的回复:] 在类内定义的函数是 inline 的(语义上)。 inline 函数必须在每一个用到的地方有定义(而不能只有声明)。
难道定义在类体内的成员函数会全部被内联处理吗?不是有些函数编译器会拒绝内联吗?这个时候会不会报重定义错误呢?[/quote]我的理解是inline函数不管有没有内联,编译器都将消除该函数的外部连接性![/quote] 大体上是这种效果[/quote]那我姑且就这么理解了,目前实践没有证伪我的理解,希望今后能够得到相关权威著作资料的佐证与明确说明。
paschen 版主 2016-08-19
  • 打赏
  • 举报
回复
头文件通常都会用#ifndef #define #endif 防止重复编译
bluewanderer 2016-08-19
  • 打赏
  • 举报
回复
引用 5 楼 K346K346 的回复:
[quote=引用 3 楼 K346K346 的回复:] [quote=引用 1 楼 fefe82 的回复:] 在类内定义的函数是 inline 的(语义上)。 inline 函数必须在每一个用到的地方有定义(而不能只有声明)。
难道定义在类体内的成员函数会全部被内联处理吗?不是有些函数编译器会拒绝内联吗?这个时候会不会报重定义错误呢?[/quote]我的理解是inline函数不管有没有内联,编译器都将消除该函数的外部连接性![/quote] 大体上是这种效果
lm_whales 2016-08-19
  • 打赏
  • 举报
回复
写在类内的成员函数在语义上是内联的 如果编译器拒绝内联,也不会报错 而是生成一份独一份的非内联代码。。。。 并把类内定义的内联语义, 当成员函数声明处理。。。定义也是声明。 inline 函数定义 其作用,与函数声明有点相似 只是,这是个函数定义而已。
恋喵大鲤鱼 2016-08-18
  • 打赏
  • 举报
回复
引用 3 楼 K346K346 的回复:
[quote=引用 1 楼 fefe82 的回复:] 在类内定义的函数是 inline 的(语义上)。 inline 函数必须在每一个用到的地方有定义(而不能只有声明)。
难道定义在类体内的成员函数会全部被内联处理吗?不是有些函数编译器会拒绝内联吗?这个时候会不会报重定义错误呢?[/quote]我的理解是inline函数不管有没有内联,编译器都将消除该函数的外部连接性!
lm_whales 2016-08-18
  • 打赏
  • 举报
回复
inline 和实际内联是两回事 但是 inline 写出了 或者直接定义在类内部的被当成inline函数 的成员函数 它 不论有几处定义 ------不论头文件包含几次,或者类被复制在不同实现文件中几次------- 都和 被内联成功一样 如果内联成功,那么就不会有函数定义的代码生成,只会用代码块取代 函数调用。 如果内联失败,那么编译器暗中生成非内联代码,共调用者使用,生成对他的函数调用 编译器暗中实现的那份非内联代码, 最终只会有一份实现, 而不是生成多份,并且都保留下来 --------如果采取生成多份策略,那么无论生成几份,最终只保留一份-------- 因为这在编译器控制能力范围之内,所以没问题。 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 用户自己编写的多份非内联实现代码, 不在编译器能力之内。 只有报错,才是本分。
恋喵大鲤鱼 2016-08-18
  • 打赏
  • 举报
回复
引用 1 楼 fefe82 的回复:
在类内定义的函数是 inline 的(语义上)。 inline 函数必须在每一个用到的地方有定义(而不能只有声明)。
难道定义在类体内的成员函数会全部被内联处理吗?不是有些函数编译器会拒绝内联吗?这个时候会不会报重定义错误呢?
kongl123 2016-08-18
  • 打赏
  • 举报
回复
嗯,inline函数可以看成代码块,代码块在每个用到的地方copy一份,但不命名,所以不会有冲突
fefe82 2016-08-18
  • 打赏
  • 举报
回复
在类内定义的函数是 inline 的(语义上)。 inline 函数必须在每一个用到的地方有定义(而不能只有声明)。

64,639

社区成员

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

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