C/C++函數的存儲類別

函數也有存儲類別,可以是外部函數(默認)或靜態函數。

C99 新增了 第 3 種類別——內聯函數。外部函數可以被其他文件的 函數訪問,但是靜態函數只能用於其定義所在的文件。假設一個文件中包含 了以下函數原型:

double gamma(double);   /* 該函數默認爲外部函數 */
static double beta(int, int);
extern double delta(double, int);

在同一個程序中,其他文件中的函數可以調用gamma()和delta(),但是
不能調用beta(),因爲以static存儲類別說明符創建的函數屬於特定模塊私 有。這樣做避免了名稱衝突的問題,由於beta()受限於它所在的文件,所以 在其他文件中可以使用與之同名的函數。
通常的做法是:用 extern 關鍵字聲明定義在其他文件中的函數。
這樣做是爲了表明當前文件中使用的函數被定義在別處。除非使用static關鍵字, 否則一般函數聲明都默認爲extern。

存儲類別的選擇

對於“使用哪種存儲類別”的回答絕大多數是“自動存儲類別”,要知道默認類別就是自動存儲類別。初學者會認爲外部存儲類別很不錯,爲何不把所有的變量都設置成外部變量,這樣就不必使用參數和指針在函數間傳遞信息 了。然而,這背後隱藏着一個陷阱。如果這樣做,A()函數可能違揹你的意 圖,私下修改B()函數使用的變量。多年來,無數程序員的經驗表明,隨意使用外部存儲類別的變量導致的後果遠遠超過了它所帶來的便利。
唯一例外的是const數據。因爲它們在初始化後就不會被修改,所以不用擔心它們被意外篡改:

const int DAYS = 7;
const char * MSGS[3] = {"Yes", "No", Maybe"};

保護性程序設計的黃金法則是:“按需知道”原則。儘量在函數內部解決 該函數的任務,只共享那些需要共享的變量。除自動存儲類別外,其他存儲 類別也很有用。不過,在使用某類別之前先要考慮一下是否有必要這樣做。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章