2013-02-10 95 views
3

這是什麼實現內聯函數對.cpp文件

//Foo.h 
struct Foo { 
    void bar() { 
    //lots of complex statements 
    } 
}; 

//Foo.h 
struct Foo { 
    void bar(); 
}; 
//Foo.cpp 
inline void Foo::bar() { 
    //lots of complex statements 
} 

之間的實際差異是否有任何在最後的這兩種方法編制的任何差異程序還是保證是相同的?

請根據哪些人應該選擇哪些方面以及爲什麼使用良好的編碼實踐/經驗做出一些評論。注意「很多複雜的陳述」。任何具體的情況下,這些東西應該實際上在頭文件中? AFAIK,大部分的升級版本庫都只有標題 - 他們爲什麼選擇這樣做?

回答

8

這兩種方法在最終編譯的程序中是否存在差異,還是保證是相同的?

兩者都是相同的。
在類/結構體內定義的成員函數隱含地爲inline
但是,在第一個示例中,函數在該頭部將被包括在內的每個翻譯單元中可以是inlined。在第二個例子中,函數只能在定義該函數的cpp文件中內聯。這是因爲編譯器需要在函數調用的時候看到一個函數的定義,以嘗試使其內聯。

要回答評論問:

比方說你保持在CPP文件A.cpp標記爲inline函數的定義,並嘗試從另一個CPP文件調用這個函數,B.cpp。您將最終得到一個「未定義的外部符號」錯誤,這是因爲在C和C++中,每個translation unit都是單獨編譯的,並且在編譯B.cpp時位於A.cpp中的函數的定義不可用。
雖然函數只從其定義的A.cpp中調用,那麼定義在同一個文件中可用,編譯器和鏈接器很樂意編譯並鏈接到它。

C++ 03 7.1.2功能指示符:
第3段:

在類定義中所定義的函數是一個內聯函數。內聯說明符不應出現在塊作用域函數聲明中。


哪一個應選擇以及爲什麼在良好的編碼習慣/體驗方面?

該類定義是作爲該類用戶的接口。這個接口的用戶不需要看到這些函數的實現細節。他們需要看到的是如何使用這個接口。通過在課堂中放置函數定義(很長時間,因爲您提到了),您向用戶提供了不必要的細節,從而使他們難以看到他們實際需要看到的內容。
去這個問題的最好辦法是:

  • 聲明中類定義的功能,無需inline關鍵字&
  • 把函數的定義與關鍵字inline類體之外。

良好閱讀:
With inline member functions that are defined outside the class, is it best to put the inline keyword next to the declaration within the class body, next to the definition outside the class body, or both?


據我所知,大多數升壓庫的是頭只 - 爲什麼他們不選擇這樣做呢?

大部分Boost庫是模板庫和基於模板庫的編譯器需要看到的定義在使用點,因此模板函數必須在線。
良好閱讀:
Why can templates only be implemented in the header file?

+0

「在最終編譯的程序中是否存在任何差異」 - 差異**存在**,標題中的函數可以在每個翻譯單元中內聯。 – Csq 2013-02-10 13:18:17

+0

@Csq:好的,我剛剛注意到第二種情況下的定義是在cpp文件中..ahh無賴。你是對的。 – 2013-02-10 13:21:06

+0

@Csq和Alok保存:所以問題是頭中函數定義的結束程序會比另一個更大,因爲函數代碼將在每個翻譯單元中,而編譯器很可能會忽略內聯請求如果函數定義在.cpp文件中?這是你想要創造的點嗎? – user2015453 2013-02-10 13:57:30

2

這兩個都是平等的,只要它的功能。但後者只能在Foo.cpp文件中內聯。