美文网首页C++
extern关键字的用法

extern关键字的用法

作者: UnderwoodY | 来源:发表于2016-04-15 20:41 被阅读1495次

前段时间在萧大的技术社区http://cocode.cc/上看到一个问题(http://cocode.cc/t/topic/4213)提问者是个初学者,问的是C语言中关于变量的外部链接的问题,其实就是extern关键字的用法,回答了一下小白的问题,同时在回答问题的过程中自己也学到了新的东西,便有了把这个答案分享出来的打算。
首先我们来看看extern的定义:


这是维基百科上的定义,extern修饰的关键字,具有文件外部链接,但是声明extern变量时,编译器并不会给这个变量分配内存,在另外的文件中定义这个文件时才会为其分配内存,一旦声明了extern关键字,对编译器来意味着:

  • 这个变量声明(即数据类型和变量名,但是编译器并没有分配内存)
  • 这个变量的定义在其他文件中(在定义变量的文件中编译器才会为其分配内存)

这看上去很奇怪,但是仔细想一想,这和函数的前置声明以及类的前置声明有异曲同工之处,在我看来这是为了将声明与实现分离,便于文件之间的数据共享。

下面来看看extern的用法:

extern主要是为了解决在几个源文件共享同一个变量,在链接各个cpp文件时。当一个cpp文件在编译的过程中,若需要一个变量但是当前的作用域没有发现其定义,如果这个变量是extern修饰的,那么编译器会知道其定义在其他文件中,在obj文件的链接过程中会得到该变量的值。


example.h example1.cpp

![Uploading QQ截图20160415194053_267714.jpg . . .]


main.cpp

如果我们仅仅在头文件中声明了extern变量而为初始化它,那么会出现” undefined reference to ‘global_x’ ”的错误,在使用extern的关键字的时候要注意一下几点:

  • extern变量可以声明多次,但是只能初始化一次,如下
  • extern变量的初始化需要在全局作用域中初始化,所以在局部作用域中不论是声明并初始化,或者声明与初始化分开都会导致编译器报错,如下:


  • 一旦声明了extern变量,那么在程序链接的时候无论它初始化没有,都会查找extern的定义,如下:

这以上是extern的一些用法,我写代码的时候很少用到extern关键字,值得注意一点的是C语言中的函数原型是本身都具有外部链接的属性的,在C语言中extern关键字的存在改变了变量的链接属性,用extern关键字修饰的变量其定义将在别处,编译器的变量的解析将推迟到链接上,在实际中,对于函数来说extern将是没有必要的修饰,而在对变量的修饰中,最好将extern变量的声明放在头文件中,将变量的定义放在一个源文件中。


相关资料:
extern的定义(Wiki需要科学上网)

extern用法的例子(浅显易懂)

关于如何正确上网使用extern(本文主要参考这个回答)

如何组织extern头文件和源文件(答主写的很用心,值得一看,我只看懂了一部分,捂脸。。。。)


Keep focus and have fun!

相关文章

  • iOS extern关键字

    extern关键字 原来经常看到extern关键字,但是一直搞不懂具体的用法,以及跟static的区别。今天就要搞...

  • OC中的关键字

    参考了:某大神 目录:关键字const/static/extern的意思&&用法 a、const; b、stati...

  • extern关键字的用法

    前段时间在萧大的技术社区http://cocode.cc/上看到一个问题(http://cocode.cc/t/t...

  • runtime的关联引用

    下文会用到const,static关键词,下一篇文章会针对const,static,extern等关键字的用法详细...

  • const,static,extern关键字笔记

    const, static, extern几个关键字,在它们的概念和用法上一直有点模糊,整理一下, 以便日后查阅。...

  • UIKIT_EXTERN 的简单用法

    转载: 1:UIKIT_EXTERN 的简单用法 2:IOS UIKIT_EXTERN, __attribute_...

  • C语言关键字"extern"用法

    利用关键字extern,可以再一个文件中引用另一个文件中定义的变量或者函数。 一、引用同一个文件中的变量 如果按照...

  • iOS 学习笔记, 代码片段

    26, extern关键字 extern关键字主要是声明这个变量已经在其他文件中声明过了(声明全局变量或者函数),...

  • const 与#define 用法

    用法 .h extern NSString * const LoginURL; .m NSString * ...

  • extern用法

    extern_百度百科 /////////////////////////////////////////////...

网友评论

    本文标题:extern关键字的用法

    本文链接:https://www.haomeiwen.com/subject/cgunlttx.html