static修饰的函数作⽤与意义
static修饰的函数作⽤与意义
static修饰的函数叫做静态函数,静态函数有两种,根据其出现的地⽅来分类:
如果这个静态函数出现在类⾥,那么它是⼀个静态成员函数;静态成员函数的作⽤在于:调⽤这个函数不会访问或者修改任何对象(⾮static)数据成员。
static修饰的变量其实很好理解,类的静态成员(变量和⽅法)属于类本⾝,在类加载的时候就会分配内存,可以通过类名直接去访问;⾮静态成员(变量和⽅法)属于类的对象,所以只有在类的对象产⽣(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
如果它不是出现在类中,那么它是⼀个普通的全局的静态函数。这样的static函数与普通函数的区别是:⽤static修饰的函数,限定在本源码⽂件中,不能被本源码⽂件以外的代码⽂件调⽤。
⽽普通的函数,默认是extern的,也就是说它可以被其它代码⽂件调⽤。在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的⽂件当中可见,不能被其他⽂件所⽤。因此定义静态函数有以下好处:
<1> 其他⽂件中可以定义相同名字的函数,不会发⽣冲突。
<2> 静态函数不能被其他⽂件所⽤。
extern⽤法总结
在C语⾔中,修饰符extern⽤在变量或者函数的声明前,⽤来说明“此变量/函数是在别处定义的,要在此处引⽤”。
1. extern修饰变量的声明。
如果⽂件a.c需要引⽤b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引⽤变量v。这⾥需要注意的是,被引⽤的变量v的链接属性必须是外链接(external)的,也就是说a.c要引⽤到v,不只是取决于在a.c中声明extern int v,还取决于变量v本⾝是能够被引⽤到的。
这涉及到c语⾔的另外⼀个话题--变量的作⽤域。能够被其他模块以extern修饰符引⽤到的变量通常是全局变量。还有很重要的⼀点是,extern int v可以放在a.c中的任何地⽅,⽐如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引⽤到变量v了,只不过这样只能在函数fun 作⽤域中引⽤v罢了,这还是变量作⽤域的问题。对于这⼀点来说,很多⼈使⽤的时候都⼼存顾虑。好像extern声明只能⽤于⽂件作⽤域似的。
2. extern修饰函数声明。
从本质上来讲,变量和函数没有区别。函数名是指向函数⼆进制块开头处的指针。如果⽂件a.c需要引⽤b.c中的函数,⽐如在b.c中原型是int
fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使⽤fun来做任何事情。
就像变量的声明⼀样,extern int fun(int mu)可以放在a.c中任何地⽅,⽽不⼀定⾮要放在a.c的⽂件作⽤域的范围中。对其他模块中函数的引⽤,最常⽤的⽅法是包含这些函数声明的头⽂件。使⽤extern和包含头⽂件来引⽤函数有什么区别呢?extern的引⽤⽅式⽐包含头⽂件要简洁得多!extern的使⽤⽅法是直接了当的,想引⽤哪个函数就⽤extern声明哪个函数。
这样做的⼀个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在⼤型C程序编译过程中,这种差异是⾮常明显的。
3. 此外,extern修饰符可⽤于指⽰C或者C++函数的调⽤规范。
⽐如在C++中调⽤C库函数,就需要在C++程序中⽤extern “C”声明要引⽤的函数。
这是给链接器⽤的,告诉链接器在链接的时候⽤C函数规范来链接。主要原因是C++和C程序编译完成后在⽬标代码中命名规则不同。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论