[英]In C++, is it better to use #define or const to avoid magic numbers?
[英]C++ - Put const magic numbers into namespace or not
我一直使用#define
在cpp文件開頭的某個位置定義幻數。 我想將其更改為const
數字。 (在cpp文件中聲明/定義的全局變量。)這是一個好主意嗎? 我應該將它們放入匿名名稱空間嗎? 我從不在任何地方#include
cpp文件。
基本上,選擇這樣的#define
“ consts”的唯一原因是預處理器本身是否需要使用它們。 除此之外,與使用此類#define
相比, constexpr
具有許多優點-它們在此處列出 。
僅當您要在同一文件中使用幻數時 , 匿名名稱空間才是一個好的解決方案,因為其中的名稱永遠無法從其他翻譯單元訪問,因為就編譯器而言,未命名的名稱空間具有唯一的標識符。 就是說,將幻數放在匿名名稱空間中並沒有真正的好處,因為任何名稱空間范圍中的 const
或constexpr
變量本質上都具有內部鏈接 。
就const
和constexpr
之間的差異在對象上下文中而言,要點是,雖然constexpr
表示在編譯期間已知的常數值,但const
僅表示在編譯期間可能未知的常數值。 1這種差異對於編譯時編程或在其他常量表達式中的使用至關重要。
1請注意,本身使用常量表達式(例如整數文字 )作為其聲明的一部分初始化的const
積分 ,即使未顯式聲明constexpr
也隱式為常量表達式 :
const int A = 50; // `A` is a constant expression
int n = 50;
const int B = n; // `B` is not a constant expression as it-
// is not being initialized with a constant expression
這是一個好主意嗎?
是的,因為#define
有幾個問題,例如:
#define SIX 1 + 5
#define NINE 8 + 1
constexpr int the_answer = SIX * NINE; // 42 and not 54
我應該將它們放入匿名名稱空間嗎?
如果在文件范圍內使用,是的,這很有意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.