關於內聯函式

2021-05-27 20:51:48 字數 1156 閱讀 7766

看c++primer時看到一句話「把內聯函式放到標頭檔案中」。當時看了後覺的挺奇怪,如果把內聯函式放到標頭檔案中 豈不是在鏈結時要報錯?因為會產生重複定義的錯誤。

但是測試了下面的**:

test.h

#ifndef  ___test_h_

#define ___test_h_

#include

inline void print()

std::cout<<"hello"<#endif

test1.cpp

#include"test.h"

test2.cpp

#include"test.h"

int main()

return 0;

沒有報錯,也就是說test1.o和test2.o中沒有相同的符號print。所以鏈結時才沒有產生錯誤。

後來又進一步考慮,除非inline函式在定義時是區域性的,也就是帶有static功能才能保證不會引起重複定義的錯誤。

但是接著又進行了下面的測試:

test.h

#ifndef  ___test_h_

#define ___test_h_

#include

inline void print();

#endif

test1.cpp

#include"test.h"

inline void print()

std::cout<<"hello"<

test2.cpp

#include"test.h"

int main()

print();

return 0;

這個時候報錯了,錯誤原因是print 符號無法解析。

也就是說編譯完成後 在test1.o中沒有print 的函式體,才會導致鏈結時 test2.o中的print無法定位。

所以經過上面的測試 得到乙個結論,也就是 內聯函式在編譯時就進行了符號替換,也就是在呼叫內聯函式的地方用函式體進行了替代。而函式在編譯後就沒有了,這樣也就避免了過程呼叫 可以加快程式的執行。所以如果要在多個原始檔中使用同一內聯函式最好的辦法就是在標頭檔案中定義該內聯函式,否則就要在不同的原始檔中都要定義該內聯函式了。

關於內聯函式

內聯函式 inline function與一般的函式不同,不是在呼叫時發生控制轉移,而是在編譯階段將函式體嵌入到每乙個呼叫語句中。內聯函式 inline function 與編譯器的工作息息相關。編譯器會將程式中出現內聯函式的呼叫表示式用內聯函式的函式體來替換。cpp 在類裡定義的成員函式會被隱含指...

關於c 的內聯函式

1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內。2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率問題。另外,前面我們講到了巨集,裡面有這麼乙個例子 define abs x x 0?x x 當 i出現時,巨集就會歪曲我們的意思...

mysql 內聯函式 Kotlin內聯函式

內聯函式使用關鍵字內聯宣告,內聯函式的使用增強了高階函式的效能。內聯函式告訴編譯器將引數和函式複製到呼叫站點。虛函式或區域性函式不能宣告為內聯。以下是內聯函式內部不支援的一些表示式和宣告 區域性類宣告 內部巢狀類的宣告 函式表示式 宣告區域性函式 區域性可選引數的預設值 讓我們看一下內聯函式的基本示...