函數也具備存儲類。函數能夠是外部的(默認狀況下)或者靜態的(C99增長了第三種可能性,即在第16章「C預處理器和C庫"中將討論的內聯函數)。外部函數能夠被其餘文件中的函數調用,而靜態函數只能夠在定義它的文件中使用。例如,考慮一個包含以下函數聲明的文件:程序員
double gammma(); /*默認爲外部的*/ static double beta(); extern double delta();
函數gamma()和delta()可被程序的其餘文件中的函數使用,而beta()則不能夠。由於beta()被限定在一個文件內,故能夠其餘文件中使用具備相同名稱的不一樣函數。使用static存儲類的緣由之一就是建立爲一個特定模塊所私有的函數,從而避免可能的名字衝突。函數
一般使用關鍵字extern來聲明在其餘文件中定義的函數。這一習慣作法主要 是爲了使程序更清晰,由於除非函數聲明使用了關鍵字static,不然認爲這是extern的。設計
使用哪一種存儲類指針
對於」使用哪一種存儲類?「這個問題的回答多半是"自動的」。不然爲何要選擇自動類型做爲默認類型?是的,咱們知道乍看起來外部存儲頗有誘惑力。把變量都設成外部變量,就不用爲使用參數和指針在函數之間傳遞數據而費心了。然而,這存在着一種不十分明顯的缺陷。您將不得不爲函數A()違背您的意圖,偷偷修改了函數B()所用的變量而焦急。多年來,無數程序員的經驗給出了不容置疑的證據,證實隨意使用外部變量帶來的這一不十分明顯的危險遠比它所帶來的表面吸引力重要。code
保護性程序設計中一個很是重要的規則就是「須要知道」原則。儘量保持每一個函數的內部工做對該函數的私有性,只共享那些須要共享的變量。除了自動類型之外,其餘類型也是有用的,而且可用。但請在使用一個類型前,問問本身是否必須那樣作。程序設計