簡體   English   中英

為什么有人會使用#define 來定義常量?

[英]Why would someone use #define to define constants?

這是一個簡單的問題,但為什么有人會使用#define 來定義常量?

有什么區別

#define sum 1const 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 中。

如果常量需要在多個程序中使用,請使用#defineheader 文件中定義,以便包含在其他程序中。 如果只在一個程序中使用常量,使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM