定義C函數(shù)時(shí),在缺省情況下函數(shù)的名字是全局可見(jiàn)的??梢栽诤瘮?shù)的名字前加個(gè)冗余的extern關(guān)鍵字,也可以不加,效果是一樣的。
這個(gè)函數(shù)對(duì)于鏈接到它所在的目標(biāo)文件的任何東西都是可見(jiàn)的,如果想限制對(duì)這個(gè)函數(shù)的訪問(wèn),就必須加個(gè)static關(guān)鍵字。
return_type fun() { /*在任何地方均可見(jiàn)*/ }
extern return_type fun() { /*在任何地方均可見(jiàn)*/ }
static return_type fun() { /*在這個(gè)文件之外不可見(jiàn)*/ }
在C中,事實(shí)上,很多人都沒(méi)有在函數(shù)名前添加存儲(chǔ)類型說(shuō)明符的習(xí)慣,所以大多數(shù)函數(shù)都是全局可見(jiàn)的。
這種太大范圍的全局可見(jiàn)性會(huì)與C語(yǔ)言的另一個(gè)特性互相影響,那就是interposition。interposition就是用戶編寫(xiě)和庫(kù)函數(shù)同名的函數(shù)并取而代之的行為。許多C程序員完全沒(méi)有注意過(guò)這個(gè)特性。
范圍過(guò)寬的問(wèn)題常見(jiàn)于庫(kù)中:一個(gè)庫(kù)需要讓一個(gè)對(duì)象在另一個(gè)庫(kù)中可見(jiàn),唯一的方法是讓它變得全局可見(jiàn)。但這樣一來(lái),它對(duì)于鏈接到該庫(kù)的所有對(duì)象都是可見(jiàn)的了。這就是"all-or-nothing"——一個(gè)符號(hào)要么全局可見(jiàn),要么對(duì)其他文件都不可見(jiàn)。在C語(yǔ)言中,對(duì)信息可見(jiàn)性的選擇就是這么有限。
一個(gè)大型函數(shù)內(nèi)部的一群調(diào)用的內(nèi)部函數(shù),如果外文件調(diào)用不到這些內(nèi)部函數(shù),在這些函數(shù)聲明時(shí)最好加上static限定符,否則缺省情況下這些內(nèi)部函數(shù)是全局可見(jiàn)的。
軟件對(duì)象在大多數(shù)情況下應(yīng)該缺省的采用有限可見(jiàn)性,當(dāng)程序員需要讓它全局可見(jiàn)時(shí),應(yīng)該采用顯示的手段。