C 全域性變數的定義和宣告

2021-06-24 11:48:14 字數 1423 閱讀 2395

本篇文章是對c++全域性變數的宣告與定義進行了詳細的分析介紹,

1、 

宣告與定義

函式或變數在宣告時,並沒有給它實際的物理記憶體空間,它有時候可保證你的程式

編譯通過;函式或變數在定義時,它就在記憶體中有了實際的物理空間。基本型別變數的宣告和定義(初始化)是同時產生的;而對於物件來說,宣告和定義是分開的。

例如:類a

如果a a;就是乙個宣告,告訴編譯器a是a類的乙個物件變數,但是不進行初始化;

如果以後a=new a();這就是初始化,分配了空間。

如果你在編譯單元中引用的外部變數沒有在整個工程中任何乙個地方定義的話,那麼即使它在編譯時可以通過,在連線時也會報錯,因為程式在記憶體中找不到這個變數。

函式或變數可以宣告多次,但定義只能有一次。

2、全域性變數

(extern)

作用一:當它與"c"一起連用時,如extern"c" void fun(int a, int b);,則編譯器在編譯fun這個函式名時按c的規則去翻譯相應的函式名而不是c++的。

作用二:當它不與"c"在一起修飾變數或函式時,如在標頭檔案中,extern int g_nnum;,它的作用就是宣告函式或變數的作用範圍的關鍵字,其宣告的函式和變數可以在本編譯單元或其他編譯單元中使用。即b編譯單元要引用a編譯單元中定義的全域性變數或函式時,b編譯單元只要包含a編譯單元的標頭檔案即可,在編譯階段,b編譯單元雖然找不到該函式或變數,但它不會報錯,它會在鏈結時從a編譯單元生成的目標**中找到此函式。。

3、靜態全域性變數

(static)

注意使用static修飾變數,就不能使用extern來修飾,即static和extern不可同時出現。

static修飾的全域性變數的宣告與定義同時進行,即當你在標頭檔案中使用static宣告了全域性變數,同時它也被定義了。

static 修飾的全域性變數的作用域只能是本身的編譯單元。在其他編譯單元使用它時,只是簡單的把其值複製給了其他編譯單元,其他編譯單元會另外開個記憶體儲存它,在其他編譯單元對它的修改並不影響本身在定義時的值。即在其他編譯單元

a使用它時,它所在的實體地址,和其他編譯單元

b使用它時,它所在的實體地址不一樣,a 和

b對它所做的修改都不能傳遞給對方。

多個地方引用靜態全域性變數所在的標頭檔案,不會出現重定義錯誤,因為在每個編譯單元都對它開闢了額外的空間進行儲存。

4、全域性常量

(const)

const單獨使用時,其特性與static一樣(每個編譯單元中位址都不一樣,不過因為是

常量,也不能修改,所以就沒有多大關係)。

const與extern一起使用時,其特性與extern一樣。

例如:extern const char  buffer;     //寫入 .h中 ,extern可以不寫,預設是extern

const char   buffer ="123456"; // 寫入.cpp中 

全域性變數定義和聲名

全域性變數一般這樣定義 1。在一類的.cpp中定義 int myint 然後再在要用到的地方的.cpp裡extern int myint 這樣就可以用了。或在對應用h標頭檔案中宣告,在使用它的任何乙個地方都可以 include它的h標頭檔案 2。在stdafx.cpp中加入 int myint 然後...

STM32全域性變數的定義和宣告

stm32全域性變數的定義和宣告 這裡要注意變數定義和變數宣告的區別 變數定義使用 資料型別 變數名稱 的形式,編譯器需要給它分配記憶體單元的 而變數宣告使用 extern 變數型別 變數名稱 的形式,是告訴編譯器我這個變數將在其他外部c檔案中定義,我這裡只是在外部用它。編譯器就不會給它分配記憶體空...

全域性變數的定義宣告

c 中定義全域性變數要注意的地方 yandaren 1220 chinaunix部落格 c 中定義全域性變數要注意的地方 在c 中定義全域性變數是應該盡量在.cpp檔案中定義,而不要在.h 檔案中 定義,定義好了之後,可以在.件中利用 extern關鍵字進行 宣告.如果在.件中定義的話,多層包含可能...