本文目錄一覽:
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-tw/n/325125.html