免费注册 查看新帖 |

Chinaunix

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

[函数] Linux下使用内联函数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-14 10:01 |只看该作者 |倒序浏览
在Linux AS4+gcc version 3.2.3 平台下使用内联函数发现:如果在头文件中声明内联函数,在源文件中定义内联函数,在编译的过程中,就会出错。错误信息为:
[sxit@PL2000 .pre]$ g++ Test.cpp main.cpp -o inline
main.cpp:8:2: warning: no newline at end of file
/tmp/ccOhSUFX.o(.text+0x1: In function `main':
: undefined reference to `CTest::print()'
collect2: ld returned 1 exit status

相关代码如下

  1. //Test.h
  2. #include <stdio.h>
  3. class CTest
  4. {
  5. public:
  6.         inline void print();
  7. };
  8. //Test.cpp
  9. #include "Test.h"
  10. void CTest::print()
  11. {
  12.         printf("Inline function \n");
  13. }
  14. //main.cpp
  15. #include "Test.h"
  16. int main()
  17. {
  18.         CTest cTest;
  19.         cTest.print();
  20.         return 0;
  21. }
复制代码


只有当内联函数实现到类定义中,才能正常通过编译。
我想问一下:
(1)怎么样才能实现 在头文件中声明内联函数,在源文件中定义内联函数。
(2)是否是因为编译器的原因?是编译器不支持吗?

论坛徽章:
0
2 [报告]
发表于 2006-09-14 12:12 |只看该作者
顶起来

论坛徽章:
0
3 [报告]
发表于 2006-09-14 13:07 |只看该作者
(1)怎么样才能实现 在头文件中声明内联函数,在源文件中定义内联函数。
不能实现把内联函数的声明和定义分开。

(2)是否是因为编译器的原因?是编译器不支持吗?
内联是一种类似于宏的替换机制。和宏替换一样,要进行替换,你必须找到宏的定义。同样,要进行内联操作,你也必须找到替换的指令块。

内联所做的操作与普通函数调用的不同点就在于内联没有普通函数调用的那些返回地址、函数参数等压入弹出堆栈的开销。假如你把函数的定义放在一个单独的编译单元内,它作为一段指令存在,那么,要对其进行内联时,编译器如何处理函数调用时的参数入栈等操作?从哪里开始,才是实际代码的执行部分呢?

如果实在想要将其分开,只能使用一种机制来模仿这种行为。



  1. // inline.h
  2. #ifndef INLINE_H
  3. #define INLINE_H

  4. #ifdef CAN_BE_INLINE
  5. #define INLINE inline
  6. #else
  7. #define INLINE
  8. #endif // CAN_BE_INLINE

  9. #endif // INLINE_H

  10. // test.h
  11. #ifndef TEST_H
  12. #define TEST_H

  13. #include "inline.h"

  14. class Test
  15. {
  16. public:
  17.         INLINE void print();
  18. };

  19. #ifdef CAN_BE_INLINE
  20. #include "test.inl"
  21. #endif

  22. #endif // INLINE_H

  23. // test.inl
  24. #include <iostream>

  25. INLINE void Test::print()
  26. {
  27.         std::cout <<"Test::print(): simulate inline\n";
  28. }

  29. //test.cpp
  30. #include "test.h"

  31. #ifndef CAN_BE_INLINE
  32. #include "test.inl"
  33. #endif


  34. // main.cpp
  35. #include "test.h"

  36. int main()
  37. {
  38.         Test test;
  39.         test.print();

  40.         return 0;
  41. }
复制代码



通过条件编译,把内联函数的声明和实现分割到两个代码中。是否内联取决于宏CAN_BE_INLINE宏是否定义。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP