共用方式為


外部層級宣告的儲存類別規範

外部的變數是在檔案範圍的變數。 保存下來以外的任何函式,而且也有可能可以使用許多功能。 函式只可以在外部的層級定義,並因此,不能巢狀。 依照預設,外部的變數和函式的相同名稱的所有參考都都參考相同物件,這表示它們有 「 外部連結 」。 (您可以使用靜態關鍵字來覆寫此設定。 請參閱本節稍後的詳細資訊,在靜態。)

在外部層級的變數宣告的變數 ("定義宣告 」),不論是哪一定義或變數參考定義某處 (「 參考宣告 」)。

外部的區域變數宣告 (隱含或明確),也會初始化該變數是定義宣告的變數。 在外部層級的定義可以採用數種格式:

  • 使用宣告變數靜態的儲存類別規範。 您可以明確地初始化靜態 變數與常數運算式,如所述 初始化。 如果您省略初始設定式,此變數會初始化為 0,根據預設值。 比方說,這兩個陳述式是變數的兩個考量的定義k。

    static int k = 16;
    static int k;
    
  • 您在外部層級中明確地初始化的變數。 例如, int j = 3;是變數的定義j。

在外部層級的變數宣告中 (也就是所有函式以外),您可以使用靜態或extern的儲存類別規範或完全省略儲存類別規範。 您不能使用自動註冊 儲存類別規範在外部層級的終端機。

一旦變數定義在外部層級,就看得見的其餘部分轉譯單位中。 變數不是於它的宣告在相同的原始程式檔中的 [看得見的。 此外,不顯示在其他的原始程式檔的程式,除非參考的宣告會顯示,如下所述。

與相關的規則靜態包括:

  • 不需要的所有區塊之外宣告的變數靜態關鍵字永遠會保留它們的值在整個程式。 若要限制其存取特定的轉譯單元,您必須使用靜態關鍵字。 這可讓他們 「 內部發生問題 」。 這些全域整個程式,請省略明確的儲存類別或使用關鍵字extern (請參閱下一份清單中的規則)。 這可讓他們 「 外部連結 」。 內部與外部連結也會討論連結

  • 您可以定義一個變數在外部層級唯一次程式中。 您可以定義具有相同名稱的另一個變數,並靜態的不同的轉譯單位中的儲存類別規範。 因為每個靜態的定義是看得見,只會在它自己的轉譯單位,不會發生衝突。 這會提供有用的方式,若要隱藏共用之間的單一轉譯單元,函式,但看不到其他的轉譯單元,必須的識別項名稱。

  • 靜態的儲存類別規範可以套用至函式。 如果您宣告函式靜態,其名稱是宣告它的檔案之外不可見。

使用 [規則extern是:

  • extern的儲存類別規範宣告變數,其他地方定義的參考。 您可以使用extern顯示定義在另一個原始程式檔,或顯示變數之前對其定義在相同的原始程式檔中的宣告。 一經宣告在外部層級變數的參考,則變數會為宣告的參考會發生轉譯單位中的其他部分的 [看得見。

  • 對於extern參考可能無效,它所參考的變數必須定義一次,並一次,在外部層級。 這個定義 (而不extern的儲存類別) 可以是任何組成程式的轉譯單元。

範例

下列範例說明外部宣告:

/******************************************************************
                      SOURCE FILE ONE 
*******************************************************************/
#include <stdio.h>

extern int i;                // Reference to i, defined below 
void next( void );           // Function prototype            

int main()
{
    i++;
    printf_s( "%d\n", i );   // i equals 4 
    next();
}

int i = 3;                  // Definition of i

void next( void )
{
    i++;
    printf_s( "%d\n", i );  // i equals 5
    other();
}

/******************************************************************
                      SOURCE FILE TWO 
*******************************************************************/
#include <stdio.h>

extern int i;              // Reference to i in 
                           // first source file 
void other( void )
{
    i++;
    printf_s( "%d\n", i ); // i equals 6 
}

在這個範例中的兩個的原始程式檔包含的三個外部宣告總數i。 只有一個宣告都是"定義宣告 」。 該宣告,

int i = 3;

定義全域變數i ,並且將它初始化其起始值為 3。 「 參考 」 的宣告i頂端的第一個來源檔案使用extern會在檔案中的顯示於其定義的宣告全域變數。 參考的宣告i在第二個來源檔案也可以將變數看得見該原始程式檔中。 如果轉譯單位中沒有提供定義的執行個體變數,編譯器會假設沒有

extern int x;

參考的宣告和定義參考

int x = 0;

會出現在程式的另一個轉譯單位中。

所有的三個函式, main, next,以及other,執行相同的工作: 它們增加i ,並且列印。 列印 4、 5 和 6 的值。

如果變數i尚未初始化,它可能已設定為 0 會自動。 在此情況下,1、 2 和 3 的值已經被列印出來。 請參閱初始化的變數初始設定的相關資訊。

請參閱

參考

C 的儲存裝置類別