免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6540 | 回复: 15
打印 上一主题 下一主题

[C++] multiple definition of的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-23 15:59 |只看该作者 |倒序浏览
  1. // ----------------------------------------------------------------------- Test.h
  2. #include <iostream>

  3. class Test
  4. {
  5. public:
  6.     Test();
  7.     ~Test();
  8.    
  9.     // 写在这里不会报“multiple definition of”
  10.     void test1(void)
  11.     {
  12.         std:: cout << "test1" << endl;
  13.     }
  14.    
  15.     void test2(void);
  16.    
  17.     void test3(void);
  18. };

  19. // 如果写Test.h的这里就会报“multiple definition of”
  20. void Test::test2(void)
  21. {
  22.    std:: cout << "test2" << endl;
  23. }

  24. // 加了inline关键字的函数就不会报“multiple definition of”
  25. inline void Test::test3(void)
  26. {
  27.    std:: cout << "test3" << endl;
  28. }
复制代码
  1. // ----------------------------------------------------------------------- Main.cpp
  2. #include "Test.h"

  3. int main(void)
  4. {
  5.     Test t;
  6.     t.testMethod();
  7.     return 0;
  8. }
复制代码


直接在类声明中定义的test1是不是内联函数?不管代码块多大总是内联?

为什么test1(), test2()不会被提示multiple definition of,而test3()会被提示?

论坛徽章:
0
2 [报告]
发表于 2013-09-23 16:53 |只看该作者
1.对于头文件,为了防止被重复引用,可以使用
#pragma once
或者
#ifndef  XXX (以Test.h为例,那么这个XXX就是TEST_H)
#define XXX

#endif

2.类成员的实现部分不要写在头文件中,而是得写在相应的源文件中,例如Test.cpp

3.内联函数去解决 “重复定义”的问题,那只是偶然,跟它一点关系都没有。

论坛徽章:
0
3 [报告]
发表于 2013-09-23 17:01 |只看该作者
内联函数解决重复定义是不是在编译阶段函数被内联掉了,也就没有那个函数了所以才解决了函数重复定义的问题?
像Test类中的test1那样写的话,默认是不是就是内联的?不管test1的代码块有多大都是内联的么?回复 2# Ox155


   

论坛徽章:
0
4 [报告]
发表于 2013-09-23 17:03 |只看该作者
对于代码(函数)不含有循环语句或者是代码行数只有几行的,都默认是内联 。

论坛徽章:
0
5 [报告]
发表于 2013-09-23 17:09 |只看该作者
Test的test1函数,不报重复定义是什么原因?
回复 4# Ox155


   

论坛徽章:
0
6 [报告]
发表于 2013-09-23 17:11 |只看该作者
你有没发现,你的test1和其它两个函数不一样。
test1的实现在类里面,test2,test3在类外。

论坛徽章:
0
7 [报告]
发表于 2013-09-23 17:17 |只看该作者
在类里面定义就不算重复定义了? 回复 6# Ox155


   

论坛徽章:
0
8 [报告]
发表于 2013-09-23 17:21 |只看该作者
哎哟,你自己试试不就知道了!
还有  这是基础知识

论坛徽章:
0
9 [报告]
发表于 2013-09-23 17:23 |只看该作者
恩,正在学c++的基础东西,谢谢了~
回复 8# Ox155


   

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
10 [报告]
发表于 2013-09-24 11:45 |只看该作者
回复 9# yuanzhifei89


    C++有一次定义原则(ODR):翻译单元包含的任何变量,函数,类,枚举或模板定义不可以多于一次(头文件被不同的实现文件包含了几次那么在头文件中定义任何内容就会有几次定义出现)。
任何程序只能精确的含有任何非inline函数一次定义。一个在类内定义的函数默认是inline的。在调用inline函数地方直接进行代码替换不存在使用函数符号的跳转。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP