不同.c文件中聲明的全局變量的使用理解


經常在C語言中遇到這樣的情況,一個.c文件中定義的 全局變量例如i,在另一個.c文件中能用使用嗎?

答案是:可以的,全局變量默認是extern的,函數也是。如果你寫了static修飾它就不行了

下面是各個概念:

全局變量:

全局變量具有全局作用域。,它只編譯期被始化一次,它不能用變量來初始化。全局變量只需要在一個源文件中定義,就可以作用於所有的源文件。在其他不包含全局變量定義的源文件中需要用extern關鍵詞來再次聲明這個全局變量

例如在單個.c文件中

 1 int a, b;  //全局變量
 2 void func1(){
 3     //TODO:
 4 }
 5 float x,y;  //全局變量
 6 int func2(){
 7     //TODO:
 8 }
 9 int main(){
10     //TODO:
11     return 0;
12 }

上面的變量a,b就是全局變量。在有的時候,項目是進行划分的,會有不同個.c文件的出現,如果在不同.c中出現例如變量a、b這樣的變量,

局部變量:

局部變量只有局部作用域,它只在函數調用執行期間存在,函數一次調用執行結束后,變量被撤銷,其所占用的的內存也被回收

例如:

int f1(int a){
    int b,c;  //a,b,c僅在函數f1()內有效
    return a+b+c;
}
int main(){
    int m,n;  //m,n僅在函數main()內有效
    return 0;
}

靜態全局變量:

靜態全局變量具有全局作用域,,它只編譯期被始化一次,它不能用變量來初始化。它作用於定義它的文件里,不能作用到其它的文件里。這樣即使多個不同的源文件定義了同名的靜態全局變量,他們也是不同的變量。

靜態局部變量:

靜態局部變量只有局部作用域,它只編譯期被始化一次,它不能用變量來初始化。在它初始化之后便一直存在,直到程序運行結束。它與全局變量的區別是:全局變量是對所有的函數是可見的,而靜態局部變量只對定義自己的函數體始終可見。

 

宏:

 

宏定義又稱為宏代換、宏替換,簡稱“宏”。在預編譯(即宏展開)階段使用具體的內容替換宏名,預編譯過程是不做語法檢查的,這樣導致在宏在程序中出錯不好判斷。
 
宏與變量的區別:
1. 宏定義不分配內存,變量定義需要分配內存
2. 宏不分數據類型,變量區分數據類型。
3. 宏定義之后值是不能改變的,變量的值是可以改變的
 
宏與const常變量的區別:
1. 宏系統不為它分配內存,const定義的常量系統為它分配內存
2. 宏在預編譯階段直接進行替換過,不進行數據類型及語法的檢驗, const定義的常量在編譯時進行嚴格的類型和語法檢驗,可以避免出錯。

 

分配內存空間:

分配內存空間:

局部變量分配在棧空間;

全局變量、靜態變量都分配在靜態存儲區;

宏不分配內存空間

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM