1. 程式人生 > >函式設定為內聯inline之後編譯報錯LINK ERROR 2019相關

函式設定為內聯inline之後編譯報錯LINK ERROR 2019相關

   在改程式碼的時候,將一些函式設定為行內函數在debug版本下沒問題,但是編譯成release時報錯,具體錯誤表現如圖:

我查了一下,原因是行內函數宣告與定義分開時,不可以被其他檔案引用。就是說,在類A中,有一個行內函數a(),如果我們在A.h中對其宣告並定義,那麼並沒有影響;但如果我們在A.h中對其宣告,然後在A.cpp中對其定義,那麼不能在其他的類中再使用它。

 

藉此直接整理一下行內函數相關:

行內函數需要注意的有:

1.inline寫在定義上而不是宣告上

2.inline函式寫標頭檔案而不是原始檔

內聯時必須已經有了函式體才能做程式碼展開,如果函式定義在其它.cpp檔案中編譯的時候函式定義的程式碼就在其它obj檔案裡了,也就無法展開。

但是完全定義在 class/struct/union 定義內的函式將自動地成為行內函數(隱式)

用inline定義為內聯之後具體是否成為行內函數由編譯器決定,即:

關鍵詞 inline 的含義是非繫結的,編譯器擁有對任何不標記為 inline 的函式使用內聯替換的自由,和對任何標記為 inline 的函式生成函

數呼叫的自由。這些優化選擇不改變關於多個定義和共享 static 的規則。

若擁有外部連結的 inline 函式或變數在不同翻譯單元定義不同,則行為未定義。即nline 函式或變數在程式中可擁有多次定義,只要每個定義都出現

在不同翻譯單元中(對於非 static inline 函式和變數)且所有定義等同。

inline 指定符不能與塊作用域內(函式內部)的函式宣告一同使用

 

inline 指定符不能重宣告已於翻譯單元定義為非 inline 的函式。

隱式生成的成員函式和任何在其首條宣告宣告為預設的成員函式為 inline ,正如任何其他定義在類定義內的函式。

若 inline 函式在不同翻譯單元宣告,則預設引數的積累集合必須在每個翻譯單元的末尾相同。

C 中, inline 函式不必在每個翻譯單元宣告為 inline (至多一個可為非 inline 或 extern inline ),函式定義不必相同(但程式行為不能依賴

呼叫的是哪個函式),且函式局域的 static 在同一函式的不同定義間不同。