亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2825 | 回復(fù): 2
打印 上一主題 下一主題

[函數(shù)] Linux下使用內(nèi)聯(lián)函數(shù)的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-09-14 10:01 |只看該作者 |倒序?yàn)g覽
在Linux AS4+gcc version 3.2.3 平臺(tái)下使用內(nèi)聯(lián)函數(shù)發(fā)現(xiàn):如果在頭文件中聲明內(nèi)聯(lián)函數(shù),在源文件中定義內(nèi)聯(lián)函數(shù),在編譯的過程中,就會(huì)出錯(cuò)。錯(cuò)誤信息為:
[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

相關(guān)代碼如下

  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. }
復(fù)制代碼


只有當(dāng)內(nèi)聯(lián)函數(shù)實(shí)現(xiàn)到類定義中,才能正常通過編譯。
我想問一下:
(1)怎么樣才能實(shí)現(xiàn) 在頭文件中聲明內(nèi)聯(lián)函數(shù),在源文件中定義內(nèi)聯(lián)函數(shù)。
(2)是否是因?yàn)榫幾g器的原因?是編譯器不支持嗎?

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2006-09-14 12:12 |只看該作者
頂起來

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2006-09-14 13:07 |只看該作者
(1)怎么樣才能實(shí)現(xiàn) 在頭文件中聲明內(nèi)聯(lián)函數(shù),在源文件中定義內(nèi)聯(lián)函數(shù)。
不能實(shí)現(xiàn)把內(nèi)聯(lián)函數(shù)的聲明和定義分開。

(2)是否是因?yàn)榫幾g器的原因?是編譯器不支持嗎?
內(nèi)聯(lián)是一種類似于宏的替換機(jī)制。和宏替換一樣,要進(jìn)行替換,你必須找到宏的定義。同樣,要進(jìn)行內(nèi)聯(lián)操作,你也必須找到替換的指令塊。

內(nèi)聯(lián)所做的操作與普通函數(shù)調(diào)用的不同點(diǎn)就在于內(nèi)聯(lián)沒有普通函數(shù)調(diào)用的那些返回地址、函數(shù)參數(shù)等壓入彈出堆棧的開銷。假如你把函數(shù)的定義放在一個(gè)單獨(dú)的編譯單元內(nèi),它作為一段指令存在,那么,要對(duì)其進(jìn)行內(nèi)聯(lián)時(shí),編譯器如何處理函數(shù)調(diào)用時(shí)的參數(shù)入棧等操作?從哪里開始,才是實(shí)際代碼的執(zhí)行部分呢?

如果實(shí)在想要將其分開,只能使用一種機(jī)制來模仿這種行為。



  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. }
復(fù)制代碼



通過條件編譯,把內(nèi)聯(lián)函數(shù)的聲明和實(shí)現(xiàn)分割到兩個(gè)代碼中。是否內(nèi)聯(lián)取決于宏CAN_BE_INLINE宏是否定義。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP