→ 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
就會顯示錯誤訊息。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.121.117.50
推 zesiva:非常感謝詳細解答 受益很多 04/14 09:51