LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2108|回复: 3

C++类的inline成员函数问题

[复制链接]
发表于 2005-11-5 10:59:47 | 显示全部楼层 |阅读模式
在TCPL里面有介绍可以把类成员函数声明成inline从而提高运行时效率。如第10章的例子:

  1. class Date {
  2. public:
  3.     int day() const;
  4.     // ...
  5. private:
  6.     int d, m, y;
  7. }

  8. inline int Date::day const { return d; }
复制代码

但是发现如果将函数声明和定义分开写在.h和.cc里面,虽然能编译成模块,但是却无法链接。
如以下例子:

  1. // test.h
  2. #ifndef _TEST_H_
  3. #define _TEST_H_

  4. class test {
  5. public:
  6.     test();
  7.     test(int);
  8.     void show() const;
  9. private:
  10.     int i;
  11. }

  12. #endif

  13. // test.cc
  14. #include <iostream>
  15. #include "test.h"
  16. using namespace std;

  17. test::test()
  18. : i(0)
  19. {
  20. }

  21. test::test(int _i)
  22. : i(_i)
  23. {
  24. }

  25. inline void show() const
  26. {
  27.     cout << i << endl;
  28. }

  29. // main.cc
  30. #include "test.h"

  31. int main()
  32. {
  33.     test t(10);
  34.     t.show();
  35. }
复制代码

在使用
$ g++ -c test.cc
$ g++ -c main.cc
时没有问题,但是在链接时
$ g++ -o test main.o test.o
会报错:
main.o(.text+0x35): In function `main':
main.cc: undefined reference to `test::show() const'
但是如果将类成员定义一起写进.h文件,即不把test.cc单独编译就没有问题。不声明成inline也没问题……
不知道怎么回事?难道将类成员函数声明成inline就不能单独编译成模块了吗?请各位多指教!
发表于 2005-11-5 12:42:26 | 显示全部楼层
inline函数必须跟申明放在同一个文件中,因为它是需要就地展开的。
如果你不把它放在.h中的话,那么在你调用这个函数时,只要包含这个文件能就编译成目标文件,但是在链接时,却会发现找不到这个函数体,而无法展开,从而造成链接失败。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-5 13:22:52 | 显示全部楼层
Post by pupilzeng
inline函数必须跟申明放在同一个文件中,因为它是需要就地展开的。
如果你不把它放在.h中的话,那么在你调用这个函数时,只要包含这个文件能就编译成目标文件,但是在链接时,却会发现找不到这个函数体,而无法展开,从而造成链接失败。

原来如此!多谢指点!
回复 支持 反对

使用道具 举报

发表于 2005-11-19 16:14:16 | 显示全部楼层
嗯,定义要放到头文件
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表