本文目錄一覽:
C語言關於外部變量聲明與定義
不要在共同include的頭文件里定義。
把變量定義在其中一個C文件又或者只有它才用的頭文件里。例如
int share;
然後在其他要用的C文件中使用
extern int share;
來聲明。
c語言,變量的定義和使用
變量的聲明有兩種情況:
1、一種是需要建立存儲空間的。例如:int a 在聲明的時候就已經建立了存儲空間。
2、另一種是不需要建立存儲空間的。 例如:extern int a 其中變量a是在別的文件中定義的。
前者是“定義性聲明(defining declaration)”或者稱為“定義(definition)”,而後者是“引用性聲明(referncing declaration)”,從廣義的角度來講聲明中包含着定義,即定義是聲明的一個特例,所以並非所有的聲明都是定義,例如:int a 它既是聲明,同時又是定義。然而對於 extern a 來講它只是聲明不是定義。一般的情況下我們常常這樣敘述,把建立空間的聲明稱之為“定義”,而把不需要建立存儲空間的聲明稱之為“聲明”。很明顯我們在這裡指的聲明是範圍比較窄的,即狹義上的聲明,也就是說非定義性質的聲明,例如:在主函數中:
int main() {
extern int A;
//這是個聲明而不是定義,聲明A是一個已經定義了的外部變量
//注意:聲明外部變量時可以把變量類型去掉如:extern A;
dosth(); //執行函數
}
int A; //是定義,定義了A為整型的外部變量
外部變量的“定義”與外部變量的“聲明”是不相同的,外部變量的定義只能有一次,它的位置是在所有函數之外,而同一個文件中的外部變量聲明可以是多次的,它可以在函數之內(哪個函數要用就在那個函數中聲明)也可以在函數之外(在外部變量的定義點之前)。系統會根據外部變量的定義(而不是根據外部變量的聲明)分配存儲空間的。對於外部變量來講,初始化只能是在“定義”中進行,而不是在“聲明”中。所謂的“聲明”,其作用,是聲明該變量是一個已在後面定義過的外部變量,僅僅是為了“提前”引用該變量而作的“聲明”而已。extern 只作聲明,不作任何定義。
(我們聲明的最終目的是為了提前使用,即在定義之前使用,如果不需要提前使用就沒有單獨聲明的必要,變量是如此,函數也是如此,所以聲明不會分配存儲空間,只有定義時才會分配存儲空間。)
用static來聲明一個變量的作用有二:
(1)對於局部變量用static聲明,則是為該變量分配的空間在整個程序的執行期內都始終存在。
(2)外部變量用static來聲明,則該變量的作用只限於本文件模塊。
如何在c語言中定義及引用全局變量?
1、全局變量也稱為外部變量,它是在函數外部定義的變量。
它不屬於哪一個函數,它屬於一個源程序文件。其作用域是整個源程序。在函數中使用全局變量,一般應作全局變量說明。
只有在函數內經過說明的全局變量才能使用。全局變量的說明符為extern。
但在一個函數之前定義的全局變量,在該函數內使用可不再加以說明。外部變量是在函數外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的
結尾。在此作用域內,全局變量可為各個函數所引用。編譯時將外部變量分配在靜態存儲區。
有時需要在其他文件中使用extern來聲明外部變量,以擴展外部變量的作用域。
也可用static聲明外部變量,使該變量不能被其他文件引用。有時候他們是一樣的,只有稍微一點的區別而已,不用太過於區分的。
2、定義及引用方法:
#ifdef xxx_GLOBALS
#define xxx_EXT#else#define xxx_EXT extern
#endif 上面位於.H 文件中,每個全局變量都加上了xxx_EXT的前綴,xxx代表模塊的名字。該模塊的.C文件中有以下定義:#define xxx_GLOBALS
當編譯器處理.C文件時,它強制xxx_EXT(在相應.H文件中可以找到)為空,(因為xxx_GLOBALS已經定義)。所以編譯器給每個全局變量分配內存空間,而當編譯器處理其他.C文件時,xxx_GLOBAL沒有定義,xxx_EXT被定義為extern,這樣用戶就可以調用外部全局變量。進階:在abc.H:#ifdef abc_GLOBALS
#define abc_EXT#else
#define abc_EXT extern#endif
abc_EXT unsigned int Ctr;
同時,abc.H有中以下定義:#define abc_GLOBALS
當編譯器處理abc.C時,它使得頭文件變成如下所示,因為abc_EXT被設置為空。unsigned int Ctr;
這樣編譯器就會將這些全局變量分配在內存中。當編譯器處理其他.C文件時,頭文件變成了如下的樣子,因為abc_GLOBAL沒有定義,所以abc_EXT被定義為extern。extern unsigned int Ctr;
在這種情況下,不產生內存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H 文件中定義一次就可以了。
c語言:什麼是外部變量
外部變量 是在 函數 外部定義的全局變量,它的 作用域 是從變量的定義處開始,到本 程序文件 的結尾。在此 作用域 內,全局變量可為各個 函數 所引用。編譯時將 外部變量 分配在靜態存儲區。
有時要用extern來聲明 外部變量 ,以擴展外部變量的 作用域 。 也可用static聲明外部變量,使該變量不能被其他文件引用。
用extern聲明外部變量
extern可省略不寫。
本文件里:在一個文件里,有不止一個 函數 ,外部變量在第一個函數後面定義。若用extern在第一個函數前聲明該變量則該變量可以在第一個函數中使用。
多個文件中:在其他文件中若想要用該文件中已聲明的變量,則在文件頭部聲明該變量,即可在文件中使用。
用static聲明外部變量
static聲明後該外部變量就只能在本文件中使用。
C語言關於外部變量
一般不把這兩句放在同一個源文件里。
第一個是一個變量的定義,第二個是變量的聲明。
在文件a.c中定義一個USER login_user;但是在文件b.c中要用到這個全局變量,就採用聲明的方法,extern USER login_user;來告訴編譯器,我需要用一個變量login_user;但是這個變量已經在別的文件中定義了——就這個意思。
聲明和變量定義的關係
一般在函數調用裡面
int func1(int a,int b)
{……}
int func2(……)
{
……
int x=1;
int y=2
func(x,y);
……
}
上面的x和y就是定義。而a和b就是聲明。
原創文章,作者:WIMXH,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/325125.html