[英]How to correctly define constants in C++
我在許多C ++代碼庫中看到了一個常見的模式:
Header.h:
static const int myConstant = 1;
Source1.cpp:
#include "Header.h"
Source2.cpp:
#include "Header.h"
基於:
3.5計划和聯系
...
(2.1) - 當名稱具有外部鏈接時,其表示的實體可以通過其他翻譯單元的范圍或同一翻譯單元的其他范圍中的名稱來引用。
(2.2) - 當名稱具有內部鏈接時,它表示的實體可以通過同一翻譯單元中其他范圍的名稱來引用。
...
3具有命名空間范圍(3.3.6)的名稱具有內部鏈接(如果它的名稱)
(3.1) - 顯式聲明為static的變量,函數或函數模板; 要么,
myConstant
只能從同一個翻譯單元訪問,編譯器會生成多個實例,每個翻譯單元一個包含Header.h
。
我的理解是否正確 - myConstant
多個實例myConstant
已創建? 如果是這種情況,請指點我在C ++中使用常量的更好的替代方案
編輯:
有人建議在標題中創建myConstant
extern
並在一個cpp
文件中定義它。 這是一個好習慣嗎? 我想這會使編譯器看不到該值,並阻止許多優化,例如當值出現在算術運算中時。
你在做什么應該沒問題。 優化器可能會避免為常量創建任何存儲,而是替換它對值的任何使用,只要您從不接受變量的地址(例如&myConstant
)。
頭文件中出現的模式static const int myConstant = 1
有點奇怪,因為關鍵字static
將變量定義的范圍限制為特定的轉換單元。 因此,不能從其他翻譯單元訪問該變量。 所以我不明白為什么有人可能會在頭文件中公開變量,盡管這個變量永遠不能從“外部”解決。
請注意,如果不同的翻譯單位包括標題,然后每個翻譯單元將定義自己的 ,有點“私”這個變量的實例。
我認為共同的模式應該是:
在頭文件中:
extern const int myConstant;
在整個程序的一個實現文件中:
const int myConstant = 1;
然而,評論說,這將阻止編譯器進行優化,因為在編譯翻譯單元時不知道常量的值(這聽起來很合理)。
所以似乎“全局/共享”常量是不可能的,並且可能必須在頭文件中使用 - 有點矛盾 - 關鍵字static
。
另外,我使用constexr
來指示編譯時常量(盡管編譯器可能會導出這個):
static constexpr int x = 1;
因為static
-keyword仍然擾亂我不知怎么的,我做了一些研究和實驗constexpr
沒有一個static
關鍵字,但有extern
關鍵字。 不幸的是, extern constexpr
仍然需要初始化(這使得它成為一個定義,並導致重復的符號錯誤)。 有趣的是,至少在我的編譯器中,我實際上可以在不同的轉換單元中定義constexpr int x = 1
,而不會引入編譯器/鏈接器錯誤。 但我沒有在標准中找到對此行為的支持。 但是在頭文件中定義constexpr int x = 1
比static constexpr int x = 1
更令人好奇。
所以 - 很多單詞,很少有發現。 我認為static constexpr int x = 1
是最好的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.