免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6546 | 回复: 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
16 [报告]
发表于 2013-09-25 10:12 |只看该作者
说白了,内联函数在.cpp定义的话,只能在该.cpp中被调用.要是被别的.cpp调用,就应在头文件或者类中定义.

论坛徽章:
0
15 [报告]
发表于 2013-09-24 14:31 |只看该作者
谢谢版主
回复 14# myworkstation


   

论坛徽章:
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
14 [报告]
发表于 2013-09-24 14:22 |只看该作者
回复 13# yuanzhifei89


    内联和非内联的区别

论坛徽章:
0
13 [报告]
发表于 2013-09-24 13:36 |只看该作者
在类内定义函数和在类外定义函数主要的区别是什么?
回复 12# myworkstation


   

论坛徽章:
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
12 [报告]
发表于 2013-09-24 13:23 |只看该作者
回复 11# yuanzhifei89


    不是,内联对编译器来讲只是个建议,虚函数或内容复杂的函数是不会内联的。记住内联从来都不是一个强制规定。

论坛徽章:
0
11 [报告]
发表于 2013-09-24 13:13 |只看该作者
类内定义的static函数默认也是内联的么?是不是不管代码块多大,类内定义的函数默认总是内联的?
回复 10# myworkstation


   

论坛徽章:
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函数地方直接进行代码替换不存在使用函数符号的跳转。

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


   

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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP