2014-01-31 51 views
5

我在哪裏可以正確放置inline'inline'的正確放置位置


test1.h:

class test1 
{ 
    inline void method1() {} 
}; 

test2.h:

class test2 
{ 
    void method2(); 
}; 

inline void test2::method2() {} 

test3.h:

class test3 
{ 
    inline void method3(); 
}; 

inline void test3::method3() {} 

test4.h:

class test4 
{ 
    inline void method4(); 
}; 

test4.cpp:

void test4::method4() {} 

test5.h:

class test5 
{ 
    inline void method5(); 
}; 

test5.cpp:

inline void test5::method5() {} 

test6.h:

class test6 
{ 
    void method6(); 
}; 

test6.cpp:

inline void test6::method6() {} 

test7.h:

class test7 
{ 
    inline void method7(); 
}; 

void test7::method7() {} 

(我已經習慣瞭如下代碼示例6中,但讀了很多的inline現在即時通訊不知道這anylonger) 其中的這些例子是inline正確使用率,爲什麼他們不同,他們是所有有效?

編輯#1: 所有這些例子確實是private,我沒有想到publicprotected擺在首位。正如評論中指出的那樣,可能會因此而發生重大錯誤。

+0

恕我直言,測試6基本相同,測試2無一不是正確的(當然,如果這樣做我做的是「正確」)。 –

+0

使用'inline'作爲優化功能基本上已經過時了。今天它仍然用於聯動的效果。然而,這種'inline'的使用比普通的要少一些,如果你想要一個「最少驚訝」的編程風格,你應該儘可能地避免它。哦,[常問問題](http://www.parashift.com/c++-faq-lite/inline-functions.html)。 – DevSolar

+0

真的不重要,它會被忽略:) –

回答

4

4,5和6(可能)是錯誤的:內聯函數必須在使用它們的每個翻譯單元中定義,因此它們只允許在一個翻譯單元中使用函數。對於只由同一個源文件中定義的其他函數調用的私有函數,這可能是可以接受的,但是可以防止通常希望從頭中聲明的函數獲得更一般的用法。

其他都是等價的:它們至少包含一個內聯聲明,並且只有一個定義,因此定義可以包含在需要的任何地方。 (只要標題被適當地保護以防止重新包含,以防止單個翻譯單元中的多個定義)。

首先,inline關鍵字是多餘的:在類定義中定義的函數隱式內聯。

我會建議反對3和7,因爲如果您稍後決定函數不應內聯,它們需要更改聲明和定義。這使得1和2成爲我的首選選項;而且我只使用1作爲非常短的函數以避免混亂的類定義。

2

除了4,5和6以外的所有示例都是正確的,只要您在inline已有 被發現之前不要調用該函數。實際上,7是我在 成功的大型項目中見過的唯一一個;對於本地類,在 中定義了一個源文件,也使用了1,但沒有使用inline關鍵字 (這裏是隱含的)。

+4

你看到7個以上?我有相反的經歷。 – Simple

+0

@Simple我從來沒有見過2在實際的代碼(雖然它是合法的)。 –

+0

「,前提是您在使用內聯的聲明之前不要調用該函數」 - 爲什麼不?是否有一些規則,我和我所使用的編譯器都不知道? –

1

測試4我相信可能會給你一個編譯錯誤,因爲編譯器會期望聲明文件中的代碼。 inline關鍵字指定代碼實際主體的位置(在同一文件中,鏈接)以及插入調用函數的代碼的完整主體。第一部分很重要,因爲如果代碼的主體位於與指定的內聯不同的文件中,則編譯將失敗。

這裏用一個概述短MSDN文章: http://msdn.microsoft.com/en-us/library/1w2887zk.aspx