2013-12-19 30 views
1

據我所知,在lib文件中聲明爲「inline」的函數是不可能的,並且將函數「神奇地內聯」爲一個調用函數到另一個項目中(因爲鏈接與編譯不同,後者發生之前)。C++ - 如何內聯一個駐留在.lib中的函數?

如何在具有相同聲明但定義不同的多個函數(多個庫)中內聯函數?

例如

obj1.lib

void function1() { printf("Hi"); } 

obj2.lib

void function1() {printf("whatsup?"); } 

的main.cpp

void function1(); 

int main() 
{ 
    function1(); // I'd like to be able to inline this, I can steer the linking against obj1 or obj2, but I can't inline this one 
} 
+2

你的意思是在內聯的優化意義上?您需要打開鏈接時間優化,其中GCC爲'-flto',MSVC++爲全程序優化。這不會保證內聯,但它至少可以實現。 –

回答

1

即使你的內聯函數,他們總是必須有相同的定義:具有C++程序中同一個實體的不同定義違反了一個定義規則(ODR)在3.2 [basic.def.odr]中指定。 ODR違規通常不會被編譯器和連接器檢測到,並且往往會導致相當奇怪的問題。

你需要確保的功能是不同的,例如,使用這些技術之一:

  1. 給他們一個不同的名稱。
  2. 將函數放入命名空間。
  3. 給函數一個不同的簽名。
  4. 使static僅在給定的翻譯單元中才能看到它們。
0

編輯迴應山姆克里斯托爾的評論。

如果你的意思是「內聯在編譯時」,則:

爲了使用你需要包括與該庫相關聯的頭文件(S)的庫。如果所需的函數在該頭文件中內聯聲明並且函數定義(函數的主體)可用,那麼編譯器將(根據自己的判斷)內聯該函數。否則它不會。

如果你的意思是「內嵌鏈接時」(這個詞「內聯」的一個不幸的超載),比看其他的答案

+0

有時候感覺需要圍繞內聯歧義進行一些語言開發。一週有幾個問題將C++定義中的「內聯」與LTO意義上的「內聯」混爲一談。 –

+0

啊 - 我不熟悉單詞「inline」的重載這似乎是一個不幸的選擇,但谷歌確實找到兩種用法。謝謝你指出這一點,山姆。 –

1

最簡單的辦法就是給這些功能賦予不同的名字。

如果要內置時間選擇具有給定名稱的函數,該函數具有2個或更多不同的實現,並且您希望支持該函數的機器代碼內聯,則將其聲明爲inline,這還需要提供在每個變體的頭文件中實現,並使用include和lib路徑來選擇他們最好匹配的相關頭文件(用於編譯)和lib(用於鏈接)–。與任何inline函數一樣,這不保證機器代碼內聯。關於機器代碼內聯inline只是一個提示(它保證的效果是允許在每個翻譯單元中定義,並且需要在每個翻譯單元中使用它的定義)。

如何使用include和lib路徑取決於您的工具鏈。