gcc的大坑,inline函式

2021-05-26 15:19:38 字數 470 閱讀 1763

為什麼說inline函式是gcc的乙個大坑呢?因為對inline的處理,它做了c99標準之外的東西,雖然更方便了,但是埋下了相容性的隱患。我偶然想用icc編譯以前的**發現鏈結不能通過,引用乙個inline函式提示未定義。

網上有篇日誌講的很詳細:gcc中的inline關鍵字  (沒時間細看= =+)

具體的現象是:乙個類的標頭檔案中宣告了inline函式,其在乙個cpp檔案中定義,在另乙個cpp檔案中被引用;gcc編譯能夠通過,因為此時函式當做extern處理;icc編譯就不能通過了。

好的用法:(1) 定義類的時候直接將函式體寫在類的定義裡,不使用原型宣告,適用於簡單的函式 (2)inline函式定義在標頭檔案中,引用時包含此標頭檔案 (3) 函式宣告不加inline(實際加了也沒用),inline函式的定義放在引用inline函式的檔案中。

總體的說,按照標準inline在編譯階段處理(非鏈結階段),引用檔案中必須能找到函式體,這也是防止inline被濫用。

inline函式 C 內聯函式 inline

inline要起作用,必須要與函式定義放在一起,而不是函式的宣告 inline 當編譯器處理呼叫內聯函式的語句時,不會將該語句編譯成函式呼叫的指令,而是直接將整個函式體的 插人呼叫語句處,就像整個函式體在呼叫處被重寫了一遍一樣,在執行時是順序執行,而不會進行跳轉。優點 內聯函式沒有執行函式呼叫的開銷...

inline函式的總結

內聯說明對於編譯器僅僅是乙個建議,編譯器可以忽略這個建議 下面沒有加lnline的時候,機器進行編譯操作 一般的函式呼叫,進行壓棧操作,導致系統開銷加大,花費了更多時間。下面是加了inline的程式設計 用inline修飾的函式,在編譯時會在呼叫的內聯函式地方展開,沒有壓棧開銷。以空間為代價,提高了...

inline 內聯函式

一 inline關鍵字用來定義乙個類的內聯函式,引入它的主要原因是用它替代c中表示式形式的巨集定義。表示式形式的巨集定義一例 define expressionname var1,var2 var1 var2 var1 var2 為什麼要取代這種形式呢,且聽我道來 1 首先談一下在c中使用這種形式巨...