簡體   English   中英

#在 C++ 中定義常量

[英]#defining constants in C++

在各種 C 代碼中,我看到常量定義如下:

#define T 100

而在 C++ 示例中,它幾乎總是:

const int T = 100;

我的理解是,在第一種情況下,預處理器會將 T 的每個實例替換為 100。在第二個示例中,T 實際上存儲在內存中。

在 C++ 中 #define 常量被認為是不好的編程習慣嗎?

在 C++ 中 #define 常量被認為是不好的編程習慣嗎?

是的,因為所有的宏(這是#define定義的)都在一個命名空間中並且它們在任何地方都有效。 變量,包括const限定的變量,可以封裝在類和命名空間中。

在 C 中使用宏是因為在 C 中,一個const限定的變量實際上並不是一個常量,它只是一個不能修改的變量。 例如, const限定的變量不能出現在常量表達式中,因此它不能用作數組大小。

在 C++ 中,使用常量表達式(如const int x = 5 * 2; )初始化的const限定對象一個常量,可以在常量表達式中使用,因此您可以並且應該使用它們。

在第二種情況下,不需要將T存儲在“內存中”,除非您執行諸如獲取它的地址之類的操作。 所有變量都是如此。

第二個更好的原因是第一個會經常在預處理器階段“消失”,因此編譯器階段永遠不會看到它(因此不會在調試信息中提供給您)。 但是這種行為不是標准所要求的,而是一種常見的做法。

除了用於條件編譯之外,幾乎不需要使用#define語句。 單個常量可以用const完成,多個相關常量可以用enum完成,宏可以用inline函數替換。

由於 C 和 C++ 中常量概念的不同,在 C 中我們基本上大部分時間都被迫使用#define (或enum )。 const在大多數情況下在 C 中不起作用。

但是在 C++ 中沒有這樣的問題,所以在 C++ 中依賴#define d 常量確實是不好的做法(除非出於某種原因你真的需要一個文本替換的常量)。

是的。 至少,使用枚舉。 const intenum都將在編譯時進行評估,因此您具有相同的性能。 然而,它更簡潔,更容易調試(調試器實際上知道 T 是什么),它是類型安全的,並且不太可能在復雜的表達式中中斷。

預處理器宏不考慮范圍- 這是一個簡單的文本替換 - 而static const int blah = 1; 可以包含在命名空間中。 編譯器仍會優化這兩種情況(除非您獲取該變量的地址),但它是類型和范圍安全的。

是的。 最大的原因是預處理器定義不遵守語言的范圍規則,污染全局命名空間,更糟糕的是——它們甚至在以下情況下被替換

x->sameNameAsPreprocessorToken

由於預處理器定義在文本級別被替換,變量的其他正常屬性不適用 - 您可以獲取 int const 的地址,但不能獲取 #define'd 常量的地址。

正如其他人所指出的,您通常也會失去類型安全和調試能力。

另一個很酷的一點是全局整數常量可以被編譯器優化掉,這樣它們就不會占用任何空間(即內存)。 因此,它們在使用時可以被視為文字常量,並且與基於#define的常量一樣優化,而沒有所有預處理器問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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