c++中,全域性變數的儲存都是靜態儲存。但是鏈結性質可以有外部鏈結和內部鏈結。預設情況下是外部鏈結,如果在定義前加上 static ,則變為內部鏈結。
如果 int val1 = 5; 加上static ,則編譯失敗。但是如果是用const 呢。變成 const int val1 = 5;會如何呢,
答案是,也編譯失敗。
file2.obj鏈結的時候找不到val1。說明const 修飾的全域性變數 會跟static 修飾一樣,變數具有內部鏈結性質。
如果我們非要讓全域性常量具有外部鏈結性質。則需要加上extern 。
extern const int val1 = 5;
在file2.cpp宣告
如果我們的常量是定義在標頭檔案中,標頭檔案被多個cpp檔案包含呢。新建乙個header.h檔案
const int val1 = 5;
const int val2 = 100;
file1.cpp和file2.cpp分別包含header.h。
我們發現,輸出的位址值是不一樣的。說明每個cpp都有乙份常量的定義,而不是共享一組常量。
C 靜態變數 全域性變數 const
全域性陣列 不能被delete 作用域 區分名字的不同意義的上下文。c 中大多數作用域是用花括號界定的,名字從其宣告點到宣告所在作用域結束處都是可見的。include int main int sum 0 for int val 1 val 10 val sum return 1 名字main在花括...
const全域性變數位於哪個段
方法 1 設計若干個const全域性變數的例子,用g 編譯生成可執行檔案 例如a.out 2 用readelf s a.out 檢視elf檔案各段的資訊 3 用objdump s a.out檢視main函式反彙編,確定呼叫的位址 4 根據呼叫的位址和2中查單到的段資訊,確定呼叫的位址位於哪個段 5 ...
static全域性變數 全域性變數
1 全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...