--<<c和指針>>--
當組成一個程序的各個源文件分別被編譯之后, 所有的目標文件以及那些從一個或多個函數(shù)庫中引用的函數(shù)鏈接在一起, 形成可執(zhí)行程序, 然而, 如果相同的標識符出現(xiàn)在幾個不同的源文件中時, 他們表示同一個實體還是表示不同的實體? 標識符的鏈接屬性決定如何處理在不同文件中出現(xiàn)的標識符, 標識符的作用域與它的鏈接屬性有關(guān), 但這兩個屬性并不相同.
鏈接屬性包括三種: external(外部), internal(內(nèi)部)和none(無).
沒有鏈接屬性的標識符(none)總是被當做單獨的個體, 也就是說改標識符的多個聲明被當做獨立不同的實體
屬于internal 鏈接屬性的標識符在同一個源文件內(nèi)的所有聲明中都指同一個實體, 但位于不同源文件的多個聲明則分屬于不同的實體;
屬于external 鏈接屬性的標識符不論聲明了多少次, 位于幾個源文件內(nèi)都表示同一個實體.
1 ----> typedef char *a; 2 ----> int b; 3 ----> int c (4 -----> int d) { 5 -----> int e; 6 -----> int f (7 ---->int g) }
如上圖, 在缺省情況下, 標識符b, c, f的鏈接屬性為external, 其余標識符的鏈接屬性則為none, 因此, 如果另一個源文件也包含了標識符b的類似聲明并調(diào)用函數(shù)c, 它們實際上訪問的是這個源文件中定義的實體, f的鏈接屬性之所有是external 是因為它是個函數(shù)名, 在這個源文件中調(diào)用函數(shù)f, 它實際上將鏈接到其他源文件中定義的函數(shù), 甚至這個函數(shù)定義可能出現(xiàn)在某個函數(shù)庫
extern 和 static
關(guān)鍵詞extern 和 static 用于在聲明中修改標識符的鏈接屬性, 如果某個聲明在正常情況下具有external鏈接屬性, 在它前面加上 static 關(guān)鍵詞, 就可以使它的鏈接屬性變?yōu)?internal, 例如, 如果第二個聲明寫成
static int b
那么變量b 將變成這個源文件所私有, 也可以把函數(shù)聲明為static , 如下
static int c ( int d )
這樣可以防止它被其他源文件調(diào)用
static 只對缺省鏈接屬性為external的聲明才有改變鏈接屬性的效果
extern 關(guān)鍵詞規(guī)則一般而言, 它為一個標識符指定external鏈接屬性, 這樣就可以訪問在其他任何位置定義的這個實體, 為函數(shù)中某個標識符指定external 鏈接屬性, 這樣函數(shù)就可以訪問在其他源文件聲明的外部變量
static int i; int func() { int j; extern int k; extern int i; }