2010-01-25 94 views

回答

24

static意味着該方法不與類的實例相關聯。 (即它沒有「this」指針)。

inline是一個編譯提示,該方法的代碼應該被包含在內聯的地方,而不是通過普通分支調用。 (請注意,許多編譯器會忽略此關鍵字,並使用他們自己的指標來決定是否內聯)。

這些是正交(無關)的概念,所以沒有特別的原因,他們不能合併。

+3

內聯的更重要的含義是該方法的多個定義是允許的(並且假定是相同的)。這允許函數定義在多個地方包含的頭文件中。 仍然沒有理由他們不能合併。事實上,對於模板中的靜態方法,它們幾乎必須是。 – KeithB 2010-01-25 16:49:03

1

我不明白爲什麼不。靜態類成員就像一個獨立的函數,可以私人訪問其他成員函數。

2

是的,沒有理由不能組合。

1

您可以。

然而,GCC手冊說,該功能不會被編譯器集成到代碼,如果:

  1. 調用方法,你定義它之前,或
  2. 有內任何遞歸調用定義。

來源:GCC Manual - 討論C和C++。

我嘗試使用稱爲Class1的小樣本類在Visual C++中對這兩種場景進行編碼。這裏是相關的片段,其中incTest是在我的Class1.h文件中定義的。

// test static inline method - based on the GCC manual's C example 
static inline int inc (int *a) 
{ 
    return (*a)++; 
} 

// test recursive call in a static inline method 
static inline int fac (int x) 
{ 
    return x * fac(x-1); 
} 

int Class1::incTest(int* x) 
{ 
    return inc(x); 
} 

這是成功編譯的版本。但是,如果我使用的是Visual C++,並且將inc()的定義移動到incTest()的定義之後,則該文件無法成功編譯,因此在調用inc()時發生錯誤,表示「標識符不是發現」。

編輯:修改我的答案,以考慮我在Visual C++中的測試的評論和結果。

+2

這些條件都不會阻止您聲明方法內聯。 – 2010-01-25 16:51:12

+4

這是錯誤的。這兩個限制都不是C++的一部分。它們可能會限制函​​數在生成的代碼中實際內聯的能力,但您仍然可以將它們標記爲內聯。如果需要在頭文件中定義它們,例如,如果它們是模板化的,這非常有用。 – KeithB 2010-01-25 16:55:11

相關問題