※ 引述《leicheong (理昌)》之銘言:
> ※ 引述《yyshan (布丁珍奶加椰果)》之銘言:
> > 應該把宣告放在 header
> > 定義放在模組之中
> > 這樣就不會有重覆定義的問題
> 這樣的話, 為何不直接用#define, 把overhead都集中到compile time
> 呢?
原發問者已經說明理由了: #define 出的東西不會進入 symbol table,
所以 debug 的時候可是很麻煩的,尤其 header file 如果是另一個人
寫的情況。
而且 #define 不是 compiler 處理的,而是 preprocessor 處理的,
所以如果你錯誤地使用這個常數,compiler 給的訊息可能會很無助。
比如這個例子:
#define PI 3.1415926
...
PI = 2.71828;
compiler 不會告訴你「PI 是唯讀的」,而會說「invalid lvalue in
assignment」,你可能要多花點時間才找到原來 PI 是常數值。
另外一些原因是使用 const 宣告的常數具有變數的性質,所以你可以對
它們取址、或是用 namespace/class/function 限制它們的 scope。而且
const 常數帶有型別資訊,配合 function overloading 時你才知道那個
函式會被呼叫到。這些都是 #define 做不到的。
最後,你不覺得 #define 才會讓體積變大嗎?比如說你在 header 中定義
了一個很大的字串,然後在許多不同的模組中使用它,這麼一來馬上就發生
你所說的重覆定義問題。
--
※ Origin: SayYA 資訊站 <bbs.sayya.org>
◆ From: arisa.csie.org