1. 程式人生 > >定義和宣告以及extern、static關鍵字

定義和宣告以及extern、static關鍵字

1. 定義只能進行一次,宣告可以多次。 2. 變數定義是為變數分配儲存空間,也可以初始化,不初始化的定義如:int i; 3. 宣告是表明變數的型別和名稱,因此定義也是宣告。 4 . 沒有初始化的時候,有extern表示這是宣告,不是定義,不分配儲存空間,如:extern int i; 5. 但是如果有初始化時,即使加了extern也是定義,如:extern int i = 0,這個時候i只能在函式外部定義。 6. 沒有extern的宣告都可以看做是定義,如第二條。 具有檔案作用域的變數或函式,其連結屬性預設是extern的,使用static可將(而且是僅僅這種情況下才能改變)預設連結屬性為extern宣告的連結屬性改為原始檔私有的連結屬性,即internal。 在函式內部,如果在變數宣告中加入extern,則指定改變數的連結屬性為external,這樣該函式就可以訪問在其他原始檔宣告的外部變量了。 正常來說,只有在宣告的時候,加上static或extern才是必須的,但為了人為理解方便,建議是在一個地方定義變數以後(最好別把定義放在標頭檔案裡),並在使用這個變數的其他原始檔處的宣告中加上extern關鍵字,增加易讀性。 extern關鍵字用於原始檔中一個識別符號的第一次宣告時,它指定該識別符號具有external連結屬性,但是如果它用於該識別符號第二次或以後的宣告時,它並不會改變第一次宣告所指定的連結屬性,如: static int i; int func() {     int j;

    extern int k;
    extern int i; …… } 函式內部的i並不改變連結屬性為internal的i的連結屬性。 舉例說明 對於extern關鍵字來說,比較常用的場景是: a.c需要引用b.c中定義的全域性變數(注意是全域性變數,假設為i),需要在a.c中,先宣告:extern int i;然後就可以直接使用i了。而i的定義則在b.c中,且不需要加extern關鍵字,因為預設的連結屬性已經是extern了,更確切地說,只在宣告中使用extern即可(結合第四條理解)。

另外一種選擇,可以在a.h中以extern來宣告b.c中的那個變數i。這兩種方法都可以,但是在大型軟體中,還是第一種方法效率更高(加速程式編譯過程的預處理的速度)。

相關內容見《C和指標》41頁