?
This document uses PHP Chinese website manual Release
在翻譯單元的頂層(即預(yù)處理程序之后包含所有#includes 的源文件),每個 C 程序都是一系列聲明,聲明具有外部鏈接的函數(shù)和對象。這些聲明被稱為外部聲明,因為它們出現(xiàn)在任何函數(shù)之外。
extern int n; // external declaration with external linkageint b = 1; // external definition with external linkagestatic const char *c = "abc"; // external definition with internal linkageint f(void) { // external definition with external linkage int a = 1; // non-external return b; }static void x(void) { // external definition with internal linkage}
使用外部聲明聲明的對象具有靜態(tài)存儲持續(xù)時間,因此不能使用auto
或register
指定符。由外部聲明引入的標(biāo)識符具有文件范圍。
暫定定義為外部聲明沒有初始化,并且或者沒有存儲類說明或與說明符static
。
一個初步的定義是,可能會或可能不會作為一個定義的聲明。如果在同一翻譯單元中早或晚時發(fā)現(xiàn)實際的外部定義,那么暫定義只是作為聲明。
int i1 = 1; // definition, external linkageint i1; // tentative definition, acts as declaration because i1 is definedextern int i1; // declaration, refers to the earlier definition extern int i2 = 3; // definition, external linkageint i2; // tentative definition, acts as declaration because i2 is definedextern int i2; // declaration, refers to the external linkage definition
如果在同一翻譯單元中沒有定義,那么暫定義定義就像初始化程序= 0
(或者對于數(shù)組類型= {0}
)的實際定義一樣。
int i3; // tentative definition, external linkageint i3; // tentative definition, external linkageextern int i3; // declaration, external linkage// in this translation unit, i3 is defined as if by "int i3 = 0;"
與 extern 聲明不同,如果前一個聲明確定了標(biāo)識符的鏈接,那么暫定義可能與另一個同一標(biāo)識符聲明不相關(guān)。如果同一個標(biāo)識符的兩個聲明在范圍內(nèi)并且具有不同的鏈接,則行為是未定義的:
static int i4 = 2; // definition, internal linkageint i4; // Undefined behavior: linkage disagreement with previous lineextern int i4; // declaration, refers to the internal linkage definition static int i5; // tentative definition, internal linkageint i5; // Undefined behavior: linkage disagreement with previous lineextern int i5; // refers to previous, whose linkage is internal
內(nèi)部聯(lián)系的初步定義必須具有完整的類型。
static int i[]; // Error, incomplete type in a static tentative definitionint i[]; // OK, equivalent to int i[1] = {0}; unless redeclared later in this file
每個翻譯單元可以具有內(nèi)部連接(static
全局)的每個標(biāo)識符的零或一個外部定義。
如果在非 VLA(自C99以來),sizeof 或 alignof(自C11以來)以外的任何表達(dá)式中使用具有內(nèi)部鏈接的標(biāo)識符,則翻譯單元中該標(biāo)識符必須有且僅有一個外部定義。
整個程序可能具有零或一個外部定義,每個標(biāo)識符(除了內(nèi)聯(lián)函數(shù)外)(自C99以來)都帶有外部鏈接。
如果除了非 VLA(自C99以來),sizeof 或 alignof(自C11以來)之外的任何表達(dá)式中使用帶有外部鏈接的標(biāo)識符,則整個程序中某處必須有唯一的外部定義。
有關(guān)內(nèi)聯(lián)函數(shù)定義的詳細(xì)信息,請參閱內(nèi)聯(lián)。
extern
使用文件范圍聲明查看關(guān)鍵字含義的存儲持續(xù)時間和鏈接。
請參閱聲明和定義之間區(qū)別的定義。
為了標(biāo)準(zhǔn)化各種 C89之前的方法,我們發(fā)明了暫時的定義,以通過內(nèi)部鏈接轉(zhuǎn)發(fā)聲明標(biāo)識符。
C11 standard (ISO/IEC 9899:2011):
6.9 External definitions (p: 155-159)
C99 standard (ISO/IEC 9899:1999):
6.9 External definitions (p: 140-144)
C89/C90 standard (ISO/IEC 9899:1990):
3.7 EXTERNAL DEFINITIONS