天天看點

C++進階進階 第四季:const詳解(二) 常量折疊一、文章來由二、const 代替 #define三、頭檔案中的const四、常量折疊(constant folding)五、為什麼const要内部連接配接

const詳解之二

const最初動機就是代替 #define。

const 優于 #define:

(1) #define沒有類型檢查,const在編譯期(而不是預編譯期)做類型檢查;

(2)const友善調試和定位bug。

是以應該完全用const代替#define

(1)要使用const代替#define,同樣需要把const定義放進頭檔案(或其他格式檔案,include即可)。這樣通過包含頭檔案,可把const定義單獨放在一個地方并把它配置設定給一個程式設計單元。 (2)c++中的const預設為内部連接配接(internal linkage),也就是說 const 僅在被定義過的檔案裡才可見,而在連接配接時不能被其他編譯單元看到。

但是在c中僅僅在另一個檔案中定義(不用extern修飾),另一個檔案也是合法的。c中const是必需配置設定記憶體的,而c++實際上一開始是不會配置設定記憶體的,隻是存在字元表中。

(3)定義一個const時,必須賦一個值給它,除非用extern做說明:extern const int bufsize;
C++進階進階 第四季:const詳解(二) 常量折疊一、文章來由二、const 代替 #define三、頭檔案中的const四、常量折疊(constant folding)五、為什麼const要内部連接配接

通常c++編譯器并不為const建立存儲空間,相反它把這個定義儲存在它的符号表裡,但extern強制進行了存儲空間配置設定,取const位址也會**,這也解釋了const詳解(一)中可以修改const空間,但是cout原值相當于還是去符号表中找。

由于extern意味着使用外部連接配接(定義時使用extern),是以必須配置設定存儲空間,這也就是說有幾個不同的編譯單元應當能夠引用它,是以必須有存儲空間。

通常情況下,當extern不是定義的一部分時,不會配置設定存儲空間。如果使用const,那麼編譯時會進行常量折疊。

那同檔案extern呢

因為extern不是定義的一部分,是以個人認為這也不會配置設定空間。

當然想絕對不為任何const配置設定存儲是不可能的,尤其是複雜的結構。是以const的定義必須預設内部連接配接,即連接配接僅在特定的編譯單元内;否則,由于衆多的const在多個cpp檔案配置設定記憶體,引起連接配接錯誤。

連接配接程式在多個對象檔案看到統一的定義就會“抱怨”。然而,因為const預設内部連接配接,是以連接配接程式不會跨過編譯單元連接配接那些定義,是以不會有沖突。

[1] c++程式設計思想

[2] http://blog.csdn.net/bestrivenfan/article/details/50951809

繼續閱讀