經常在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定義的常量在編譯時進行嚴格的類型和語法檢驗,可以避免出錯。
分配內存空間:
分配內存空間:
局部變量分配在棧空間;
全局變量、靜態變量都分配在靜態存儲區;
宏不分配內存空間