[英]Why would someone use #define to define constants?
這是一個簡單的問題,但為什么有人會使用#define 來定義常量?
有什么區別
#define sum 1
和const int sum = 1;
#define
有許多不同的應用程序,但您的問題似乎是關於一個特定的應用程序:定義命名常量。
在 C++ 中,很少有理由使用#define
來定義命名常量。
#define
通常廣泛用於 C 代碼中,因為 C 語言在定義常量時與 C++ 有很大不同。 簡而言之, const int
對象在 C 中不是常量,這意味着在 C 中定義真正常量的主要方法是使用#define
。 (此外,對於int
常量,可以使用枚舉)。
沒有人不應該!
實際上,人們應該更喜歡const int sum = 1;
超過#define sum 1
的原因有很多:
基於 Scope 的機制:
#define
不尊重范圍,因此無法創建 class 范圍命名空間。 而 const 變量可以在類中限定范圍。
在編譯錯誤期間避免奇怪的神奇數字:
如果您使用#define
,它們會在預編譯時被預處理器替換因此,如果您在編譯期間收到錯誤,那將會令人困惑,因為錯誤消息不會引用宏名稱而是值並且它會出現一個突然的值,並且會浪費大量時間在代碼中跟蹤它。
易於調試:
同樣出於#2 中提到的相同原因,調試#define
並不會真正提供幫助。
因此,要避免上述情況, const
將是一個更好的選擇。
對於您剛剛給出的示例,我通常會使用 const。 當然,#define 可以用於其他地方的條件編譯:
#if SOME_DEFINE == 1
// Conditional code
#endif
這是你不能用 const 做的事情。 如果您不需要從預處理器訪問該值,我會說使用 const ,除非有某種原因導致這是不可能的。 C++ FAQ lite中有一些關於此的內容,他們正確地指出,僅僅因為預處理器是“邪惡的”,並不意味着你永遠不需要它。
#define
是必要的,因為 C++ 沒有真正的模塊導入系統。
#define
導致文字文本替換。 預處理器了解如何標記源代碼,但不知道它的實際含義。 當您編寫#define sum 1
時,預處理器會檢查您的代碼並查找令牌sum
的每個實例並將其替換為令牌1
。
這有很多限制: #define sq(x) x * x
如果你像sq(3+3)
一樣使用它,它將無法正常工作; 並且將#define
用於常量不會以任何方式尊重 scope,也不會將任何類型的類型與常量關聯。 但是,# #define
可以用來(尤其是與其他一些特殊的東西,如#
和##
預處理器運算符結合使用)來做一些原本不可能的魔法(除非手動執行預處理器所做的事情)。
始終嘗試使用“const int”,而不是#define。
僅當您的預處理器代碼可能被其他工具讀取時才使用#define,並且使用預處理器更容易將其轉換為 go,而不是解析語言。
這也是定義稍后由#if/#else/#endif 檢查的唯一方法
從介紹到使用 C++ 進行編程,由 Daniel Liang 編寫,指出:
當您使用
#define
指令定義常量時,該常量不會存儲在 memory 中。該常量將被編譯器替換為一個值。 當您使用const
關鍵字聲明常量時,常量與變量一樣存儲在 memory 中。
如果常量需要在多個程序中使用,請使用#define
在header 文件中定義,以便包含在其他程序中。 如果只在一個程序中使用常量,使用const
聲明效率更高。
簡單來說
#define sum 1 /*is pre processed*/
這意味着,在預處理階段完成后,該sum
不存在。
const int sum = 1; /*is compiled/linked*/
這意味着sum
存在,直到可執行文件從您的程序中生成。
const int
只是一個不能改變的 int 。 #define
是 C 預處理器的指令,它不僅僅用於定義常量。
有關詳細信息,請參見此處: http://en.wikipedia.org/wiki/C_preprocessor
第一個是預處理器指令,在編譯器編譯您的代碼之前,它將 go 通過並將 sum 替換為 1。第二個在 memory 中聲明一個變量來保存該數量。 我確信可以爭論哪個是最好的,但“const int”可能在 C++ 中更常見(當涉及數字常量時)。
http://www.geekpedia.com/KB114_What-is-the-difference-between-sharpdefine-and-const.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.