extern在C中的用法

C语言中extern的使用主要是影响函数与变量的作用域,用extern修饰的全局变量(函数)表示该全局变量(函数)可能在本文件或者其他文件用到,

对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配内存空间。因此可以被extern变量声明多次。

通常在头文件中对提供给外部文件使用的全局变量(函数)使用extern进行声明,也就是说在C文件中定义,然后在头文件中使用extern进行声明,这样当别的文件要使用本文件中定义的全局变量(函数)的时候只要包含头文件就可以了,而且在编译阶段外部文件是找不到该全局变量(函数),但是extern已经告诉编译器该全局变量(函数)在其他文件定义,所以编译器不会报错,在链接(LINK)阶段会在定义模块生成的目标代码处找到该变量(函数)

  在头文件中对于函数的声明是否使用extern都是一样的,因为函数的声明与定义永远都是相互独立的,而且格式是不一样的,编译器能自动区分函数的声明与定义。

但头文件中对于变量的声明必须使用extern,因为在没有使用extern修饰时,例如: “int a”,变量的定义与声明两个动作是同时完成的,系统将会为变量a分配内存空间,链接时将会出现重复定义的错误。加上extern后 “extern int a”将告诉编译器变量a已经下其他文件定义,接下来可以放心使用,这样既符合了C语言先定义再使用的规则,也避免了重复定义,这样编译的时候就不会出现变量a未定义的错误,链接时也不会出现变量a重复定义错误。


http://blog.sina.com.cn/s/blog_52deb9d50100ml6y.html

在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声明哪个函数。这大概是KISS原则的一种体现吧!这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。

3. 此外,extern修饰符可用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值