推 layan:hi, 這是語法的問題 04/13 16:37
→ layan:若你要inline一個 func, 你應該要把 inline implementation 04/13 16:38
→ layan:放在 .h 裡, 也就是把你的 a.c 裡的那個 implementation 04/13 16:38
→ layan:放在 a.h 裡, 這樣就 OK 了 04/13 16:39
→ QQ29:可是我用簡單的寫法試著他這樣實作宣告分開 也沒事耶我用VC8 04/13 16:42
→ layan:To QQ29, 這樣本來就可以過阿, 只是你在別的.cpp 要 call 04/13 16:46
→ layan:該 func 時, linker 會跟你說它找不到它的 implemntation. 04/13 16:46
→ layan:其實這樣的寫法大多用在 private member function. 04/13 16:47
推 QQ29:真的耶 分開在不同檔案 就不行了 謝謝你 04/13 16:49
→ zesiva:請問那是因為是class裡面的func才有這種限制嗎 04/13 16:56
→ zesiva:若不在class裡面的func要inline也要定義在.h嗎 謝謝 04/13 16:56
推 QQ29:請教一下 為什麼你沒去呼叫他就沒事 呼叫了才說 無法解晰的 04/13 17:05
→ QQ29:外部符號呢? 可以講一下原理嘛@@ 04/13 17:06
> -------------------------------------------------------------------------- <
作者: littleshan (我要加入劍道社!) 看板: C_and_CPP
標題: Re: [問題] 關於inline與class的問題
時間: Mon Apr 13 19:01:48 2009
※ 引述《zesiva (呼拉拉)》之銘言:
→ zesiva:請問那是因為是class裡面的func才有這種限制嗎 04/13 16:56
→ zesiva:若不在class裡面的func要inline也要定義在.h嗎 謝謝 04/13 16:56
是的。
請回想一下 inline 的作用:在呼叫端直接展開 function 的內容。
inline int f(int i) { return i+1; }
int XXX()
{
int x = 10;
int y = f(x); // compiler 在這邊把 f(x) 直接代換成 x+1
}
你可以想像一下,如果 .h 中沒有 f() 的內容 { return i+1; }
那呼叫 f(x) 的時候,compiler 要把它代換成什麼?
推 QQ29:請教一下 為什麼你沒去呼叫他就沒事 呼叫了才說 無法解晰的 04/13 17:05
→ QQ29:外部符號呢? 可以講一下原理嘛@@ 04/13 17:06
因為沒有呼叫時,compiler 就不會產生對應的 assembly code,
因此編譯出來的 object file 中並不會參照到這個實際上沒定義的 symbol,
這樣的 object file 可以順利連結執行,linker 也不需要報錯。
建議去找一些 assembler/linker 如何運作的相關資料,會了解比較透澈
(如 computer organization 的書)
這種「呼叫才會報錯」的現像可以引出一些小技巧,比如說
class T {
public:
explicit T(int i) : data(i) {}
private:
T(); // default ctor,宣告但不定義
T(const T&); // copy ctor,同樣宣告但不定義
T& operator=(const T&); // 同上,宣告但不定義
int i;
};
這個 class 這樣寫的目的在於要求使用者一定要用 int 作為參數來建
構 T,而不能使用 default 或 copy constructor。同時它也禁止使用
者用等號來直接複製物件。需要注意的是,如果我們不寫 default/copy
constructor 或 operator=,compiler 會自動幫我們生一個出來,而不
知情的使用者將會用得很愉快。為了避免這種情況,我們把它宣告在
private 區域中。
然而如果我們同時又提供了這些 function 的定義,那麼在 T 的 friend
或是 public derived class 中又可以順利呼叫這些 function。因此這
邊的作法是提供宣告但不給定義,若它們被其它 function 呼叫時,linker
就會顯示錯誤訊息。