看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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 就會顯示錯誤訊息。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.117.50
zesiva:非常感謝詳細解答 受益很多 04/14 09:51