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"};

保护性程序设计的黄金法则是:“按需知道”原则。尽量在函数内部解决 该函数的任务,只共享那些需要共享的变量。除自动存储类别外,其他存储 类别也很有用。不过,在使用某类别之前先要考虑一下是否有必要这样做。

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