宣告概觀
「宣告」會指定一組識別項的解譯和屬性。 如果宣告也為以識別項命名的物件或函式保留儲存區,則稱為「定義」。變數、函式和類型的 C 宣告具有下列語法:
語法
declaration
:
declaration-specifiers
attribute-seq
opt init-declarator-list
opt ;
/* attribute-seq
opt 為 Microsoft 特定 */
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
opt
type-specifier
declaration-specifiers
opt
type-qualifier
declaration-specifiers
opt
init-declarator-list
:
init-declarator
init-declarator-list
,
init-declarator
init-declarator
:
declarator
declarator
=
initializer
注意
後續章節將不再重複 declaration
的這個語法。 後續章節中的語法通常會以 declarator
非終端開頭。
init-declarator-list
中的宣告包含所要命名的識別項;init
是 initializer (初始設定式) 的縮寫。 init-declarator-list
是以逗號分隔的宣告子序列,每個宣告子都可以有額外的類型資訊及/或初始設定式。 declarator
包含所要宣告的識別項 (若有的話)。 declaration-specifiers
非終端項是由一序列的類型和儲存類別指定名稱所組成,以指示連結、儲存期,以及至少是宣告子所表示實體的部分類型。 宣告是由儲存類別規範、類型規範、類型限定詞、宣告子和初始設定式的某種組合所構成。
宣告可以包含 attribute-seq
中列出的一或數個選擇性屬性;seq
是 sequence (序列) 的縮寫。 這些 Microsoft 特定屬性可執行數個函式,本手冊中會有詳細的討論。
在一般格式的變數宣告中,type-specifier
會提供變數的資料類型。 type-specifier
可以是複合類型,就像當類型由 const
或 volatile
修改時一樣。 declarator
會為變數命名,可能會修改變數以宣告陣列或指標類型。 例如,
int const *fp;
宣告名為 fp
的變數,做為不可修飾的 (const
) int
值的指標。 若要定義宣告中的多個變數,您可以使用多個宣告子,並以逗號分隔。
一個宣告至少要有一個宣告子,否則其類型規範必須宣告結構標記、等位標記或列舉的成員。 宣告子提供有關識別項的任何其餘資訊。 宣告子是一種識別項,可以用方括號 ([ ]
)、星號 (*
) 或括號 (( )
) 來修飾,以分別宣告陣列、指標或函式類型。 當您宣告簡單變數 (例如字元、整數和浮點項目),或是簡單變數的結構和等位時,declarator
就只是識別項。 如需宣告子的詳細資訊,請參閱宣告子及變數宣告。
所有定義都是隱含的宣告,但並非所有宣告都是定義。 例如,使用 extern
儲存類別規範的變數宣告是要「參考」而不是「定義」宣告。 如果在定義外部變數之前先加以參考,或是從使用外部變數的原始程式檔,將其定義在另一個原始程式檔中,則需要 extern
宣告。 儲存體不是藉由「參考」宣告來配置,也不能在宣告中初始化變數。
變數宣告中需要有儲存類別及/或類型。 除了 __declspec
之外,宣告中只允許一個儲存類別規範,而且並非每個內容中都允許所有儲存類別規範。 __declspec
儲存類別可以與其他儲存類別規範搭配使用,而且可以多次使用。 宣告的儲存類別規範會影響如何儲存和初始化所宣告的項目,以及程式的哪些部分可以參考該項目。
C 中定義的 storage-class-specifier
終端包括 auto
、extern
、register
、static
和 typedef
。 Microsoft C 也包含 storage-class-specifier
終端 __declspec
。 除了 typedef
和 __declspec
以外的所有 storage-class-specifier
終端,都會在儲存類別中討論。 如需 typedef
的相關資訊,請參閱 typedef
宣告。 如需 __declspec
的相關資訊,請參閱擴充儲存類別屬性。
宣告在原始程式中的位置,以及變數是否有其他宣告存在,都是判定變數存留期的重要因素。 重新宣告可以有好幾個,但定義只有一個。 不過,定義可以出現在多個轉譯單位中。 針對具有內部連結的物件,此規則分別適用於各轉譯單位,因為內部連結的物件對轉譯單位而言是唯一的。 針對具有外部連結的物件,此規則適用於整個程式。 如需可見性的詳細資訊,請參閱存留期、範圍、可見性和連結。
類型規範提供識別項資料類型的一些相關資訊。 預設類型規範為 int
。 如需詳細資訊,請參閱類型指定名稱。 類型規範也可以定義類型標記、結構和等位元件名稱,以及列舉常數。 如需詳細資訊,請參閱列舉宣告、結構宣告和等位宣告。
有兩個 type-qualifier
終端:const
和 volatile
。 這些限定詞可指定只有透過左值來存取該類型的物件時,才會相關聯的其他類型屬性。 如需 const
和 volatile
的詳細資訊,請參閱類型限定詞。 如需左值定義的詳細資訊,請參閱左值和右值運算式。