首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

了解 static & extern

2013-10-28 
理解 static & extern在c / c语言中,经常会遇到这样两个关键字,static和extern,通过阅读网上的一些介绍和

理解 static & extern

在c / c++语言中,经常会遇到这样两个关键字,static和extern,通过阅读网上的一些介绍和代码实践之后,下面稍作总结。


一、首先单独介绍一下 static

1.先来介绍它的第一条也是最重要的一条:隐藏。

当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是file.cpp,另一个是main.cpp.

下面是file.cpp的内容:


所以,利用这一特性,可以在不同的文件中定义同名函数和同名变量(用static修饰),而不必担心命名冲突

Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。

2.static的第二个作用是保持变量内容的持久--静态局部变量

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。

static法则:
    A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
    B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
    C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;


二、static & extern

extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见。

用其声明的变量或函数应该在别的文件或同一文件的其它地方定义。与extern对应的关键字是 static,被它修饰的全局变量和函数只能在本模块中使用。


文件a.cstatic int i; //只在a文件中用int j;   //在工程里用static void init()         //只在a文件中用{}void callme()          //在工程中用{   static int sum;}

上面的全局i变量和init()函数只能用在a.c文件中,全局变量sum的作用域只在callme里。变量j和函数callme()的全局限扩充到整个工程文件。所以可以在下面的b.c中用extern关键字调用。extern告诉编译器这个变量或者函数在其他文件里已经被定义了。


extern void print(int i);int main(int argc,char** argv){    print(3);    return 0;}

注意在C的代码文件中直接#include "cppHeader.h"头文件,编译出错。而且如果不加extern int print(int i)编译也会出错。


总结:extern “C” 是一个双向都需要用到的语法表示,就是说在cpp引用c头文件,或者c引用cpp文件时都需要用到。但extern “C” 永远只能在cpp引用时出现,c引用时不允许存在。当cpp引用c中的函数时,需要在cpp使用的头文件中声明extern “C”,当c引用cpp中的函数时,需要在cpp使用的头文件中用extern “C”声明,这样编译器在编译时会对函数名进行特殊处理,以使其能够被c引用。如果不进行声明,那么当c引用这个头文件时,就会找不到函数,因为cpp的函数命名规则中包含变量类型,而c编译后的函数名不包含这些。


热点排行