1. 程式人生 > >C++全局變量的定義和聲明

C++全局變量的定義和聲明

全局常量 段錯誤 出現一次 工程 程序 ons 不同 全局 可執行

編譯單元

編譯分為兩個步驟:

第一步:將每個.cpp或.c和相應的.h文件編譯乘obj文件(包含預編譯,匯編、編譯)

第二部:將obj文件進行Link,生成最終的可執行文件

根據該階段錯誤大致可分為兩類:

一個,編譯時的錯誤,大多為語法錯誤

一個,鏈接時錯誤,主要是變量、函數定義錯誤

編譯單元指在編譯階段生成的每個obj文件

一個obj文件就是一個編譯單元

一個.cpp或.c和它相應的.h文件共同組成了一個編譯單元

一個由很多編譯單元組成,每個obj文件裏包含了變量存儲的相對地址等

聲明和定義

函數或變量在聲明時,並不給它分配實際的物理內存空間,他有時候可以保證程序編譯通過

函數或變量在定義時,它就在內存中有了實際的物理空間

如果在編譯單元中引用的外部變量沒有在整個工程中任何一個地方定義的話,那麽即使它在編譯時可以通過,鏈接時也會報錯,因為程序內存中找不到這個變量

函數可以聲明多次,但是只能定義一次

extern作用

作用1,當與“C”一起使用時,如 extern "C" void fun(int a, int b),則編譯器中fun這個函數名按照c語言規則命名,而不是用c++規定命名。故C++中可以利用該法則調用c函數

作用2,當他不與“C"在一起修飾變量或者函數時,如在頭文件中,extern int g_Num;其作用就是聲明函數或者變量的作用範圍的關鍵字,其聲明的函數和變量可以在本編譯單元或者其他編譯單元使用

即b編譯單元要引用A編譯的單元的全局變量或者函數時,b編譯單元只要包含a編譯單元的頭文件即可,在編譯階段,b編譯單元雖然找不到該函數或變量,但是不會報錯,他會在鏈接時從A編譯單元的目標文件中找到該定義

全局變量(extern)

有兩個類都需要使用共同的變量,這種變量就定義為全局變量。一般在頭文件中聲明,在cpp中定義,定義只能出現一次

靜態全局變量(static)

使用static修飾的變量,不能用extern修飾。

static修飾的全局變量的聲明與定義同時進行,即當你在頭文件中是使用static聲明了全局變量,同時也別定義了,

static修飾的全局變量的作用域只能是本身的編譯單元內,不同編譯單元的同名全局靜態變量是沒有關聯的,占用的物理空間也是完全獨立的

全局靜態變量一般定義在.cpp中

全局常量(const)

const單獨使用時,其特性與static一樣(每個編譯單元中地址都不一樣,不過因為是常量,也不能修改,所以就沒有多大關系)

const與extern一起使用時,其特性與extern一樣,但不能修改

C++全局變量的定義和聲明