有關C++ 實現時extern 和const的問題

怎樣把const常量實現文件間共享?
之所以會先提起這個問題,當然和要解決的問題息息相關。你也許不禁會問:難道const常量不是文件間共享的嗎?當然不是,原因是const常量的特殊性。下面我們看看c++ primer的作者怎麼說的(重點!):
/——–
當以編譯時初始化的方式定義一個const對象時,例如:
const int bufSize = 512;
編譯器將在編譯過程中把用到該變量的地方都替換成對應的值,也就是說編譯器會找到程序中所有用到bufSize的地方,然後用512替換。
爲了執行上述替換,編譯器必須知道變量的初始值。如果程序包含多個文件,則每個用了const變量的文件都必須得能訪問到他的初始值才行。要做到這一點就必須在每一個用到這個量的文件中都對他有定義。爲了支持這一用法,同時避免對同一變量的重複定義,默認情況下,const對象被設定爲僅在文件內有效(即不是文件間共享的)。從而,當多個文件中出現了同名的const變量時,其實等同於在不同文件中分別定義了獨立的變量。
——–/
作者說的很清楚,const變量在不同文件中自己是自己的互不相干!但是程序的寫法千變萬化,總會有例外的需求,所以:
/——-
某些時候有這樣一種const變量,他的初始值不是一個常量表達式,但確實有必要再文件間共享。這種情況下,我們不希望編譯器爲每個文件分別生成獨立的變量。想反,我們想讓這些const對象像其他對象(非常量)一樣工作(即在文件間共享),也就是說只在一個文件中定義,而在其他多個文件聲明並使用它。
——-/
下面給出解決方法:
對const變量不管聲明還是定義都添加extern關鍵字,這樣只需要定義一次就可以了。
對解決方法的認識:
其實就是在定義const變量的時候顯式的用extern說明了我定義的這個常量是要在文件間共享的,而非默認情況下的當前文件獨有。這樣的話僅在其他文件中聲明一下就可用同一個const變量,這正實現了和其他變量定義聲明實現的相同效果!
下面來一個例子:
這裏寫圖片描述

這裏寫圖片描述
上面兩幅圖片分別展示了兩個文件,下面看程序的輸出結果:
這裏寫圖片描述
很顯然,在我們的意料之中,num的確在兩個文件中實現了共享,而且我們僅在Exterm_Const.cpp做了const變量的定義,而在輔助文件help.h中只是做了一次聲明。
下面我把輔助文件中的聲明註釋掉,Oh,看看發生了什麼!
這裏寫圖片描述
因爲沒有了聲明,num在輔助文件中變成了陌生人,這很顯然,之前程序是在function函數中遇到num時先看到聲明,哦,原來在外面可以找到他的定義,於是程序在Exterm_Const.cpp中找到num的定義,並有了一個常量100,之後帶着這個100做了其他操作。這也說明我們真的把兩個文件中的const變量關聯在了一起,只需一次定義,其他文件中聲明可用,他真的變得和其他變量平等了!
上面的過程演示了作者的理論以及自己的一些猜想。

extern的部分功能?
extern在針對變量上的功能還是好概括的:實現同一變量在不同文件間的享而又避免重複定義的矛盾。因爲同一變量可以被聲明多次,但是絕對不可以定義多次!
用法
如果想聲明一個變量而非定義它,就在變量名前添加關鍵字extern(external ,外部的),而且不要顯式的初始化變量:
extern int i; //聲明i而不是定義i
int j; //聲明並定義j
任何包含了顯式初始化的聲明即變成了定義。我們能給由extern標記的變量賦一個初始值,但是就相當於抵消的extern的作用,也就變成了定義,而不再是聲明。
extern double pi = 3.1415; //定義而非聲明

其他:在函數體內部,如果試圖初始化一個extern關鍵字標記的變量將引發錯誤!(錯誤提示:不允許對外部變量的局部聲明使用初始化設定選項)

功能
如果要在多個文件中使用同一個變量,就必須將聲明與定義分離,此時變量的定義必須出現在一個文件中,而其他用到該變量的文件必須對其聲明,決不能重複定義。
下面是一個變量一次定義到處使用的例子:
這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

關於const與extern聯合使用的其他例子
(1)ERROR: B.cpp中的NUM無法解析,未定義。

// A.cpp

const int NUM = 100;
// B.cpp

extern const int NUM;

int i = NUM;
(2)OK

// A.cpp

const int NUM = 100;
// B.cpp

extern const int NUM = 99;

int i = NUM;
(3)OK

// A.cpp

extern const int NUM = 100;
// B.cpp

extern const int NUM;

int i = NUM;
(4)ERROR: NUM重定義

// A.cpp

extern const int NUM = 100;
// B.cpp

extern const int NUM = 99;

int i = NUM;
(5)OK

// A.cpp

extern const int NUM = 100;
// B.cpp

const int NUM = 99;

int i = NUM;
(6)OK

// A.cpp

const int NUM = 100;
// B.cpp

extern const int NUM = 99;

int i = NUM;
(可以自己編寫程序嘗試體會一下,加深對這塊內容的理解!)
好了,對於這變量的聲明與定義就先總結到這裏,畢竟自己的水平有限,哪裏有不當錯誤之處,希望大家討論交流!

參考書籍:C++ Prrimer 第五版
參考博文:http://blog.sina.com.cn/s/blog_76fbd24d0101a62k.html

發佈了50 篇原創文章 · 獲贊 228 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章