关于模块化编程extern用法

发布者:Harmonious222最新更新时间:2015-02-10 来源: 51hei关键字:模块化编程  extern 手机看文章 扫描二维码
随时随地手机看文章
用C语言编写程序的时候,我们经常会遇到这样一种情况:希望在头文件中定义一个全局变量,然后包含到两个不同的c文件中,希望这个全局变量能在两个文件中共用。

  举例说明:项目文件夹project下有main.c、common.c和common.h三个文件,其中common.h文件分别#include在main.c和common.c文件中。现在希望声明一个字符型变量key,在main.c和common.c中公用。如下图所示:

 


  有人想,既然是想两个文件都用,那就在common.h中声明一个unsigned char key,然后由于包含关系,在main.c和common.c中都是可见的,所以就能共用了。

 


  这种想法其实是很多初学者都会想到的,想起来确实有道理,但是实际写出来,我们发现编译的时候编译器提示出错,一般提示大概都类似于:Error: L6200E: Symbol key multiply defined (by common.o and main.o). 也就是说编译器认为我们重复定义了key这个变量。这是因为#include命令就是原封不同的把头文件中的内容搬到#include的位置,所以相当于main.c和common.c中都执行了一次unsigned char key,而C语言中全局变量是项目内(或者叫工程内)可见的,这样就造成了一个项目中两个变量key,编译器就认为是重复定义。

  正确的解决办法:使用extern关键字来声明变量为外部变量。具体说就是在其中一个c文件中定义一个全局变量key,然后在另一个要使用key这个变量的c文件中使用extern关键字声明一次,说明这个变量为外部变量,是在其他的c文件中定义的全局变量。请注意我这里的用词:定义和声明。例如在main.c文件中定义变量key,在common.c文件中声明key变量为外部变量,这样这两个文件中就能共享这个变量key了,如下图所示。

 



  代码如下(只写跟我们所说问题有关的部分):

  (1)main.c文件

  #include "common.h"
  unsigned char key;

  (2)common.c文件:

  #include "common.h"
  extern unsigned char key;

  很多人看了可能糊涂,这里稍微说一下,其实就是变量定义和变量声明的区别,变量定义使用“数据类型+变量名称”的形式,编译器需要给他分配内存单元的;而变量声明使用“extern 变量类型+变量名称”的形式,是告诉编译器我这个变量将在其他外部c文件中定义,我这里只是在外部用它。编译器就不给他分配内存空间,而等到真正遇到变量定义的时候再给他分配内存空间。

  由于很多人从开始学C语言就一直把定义变量叫声明变量,一开始就叫错了,所以导致现在分不清定义和声明的区别。要是还理解不了就想想函数的定义和声明,函数定义是编写函数功能实体,编译器要编译这个函数并且要分配内存空间,而函数声明并不生成函数功能实体,只是告诉编译器这是个函数,这个函数在后面将会定义实体,我这里只是提前用,编译器就会接着继续往下编译,如果子函数写在main函数之后,那么声明是必须的,如果不声明函数编译器都不知道这是个函数,编译就会报错。

  说了这么多应该说明白了,如果还有问题可以参考谭浩强的那本C语言书,书中有详细解释和例子。

关键字:模块化编程  extern 引用地址:关于模块化编程extern用法

上一篇:stc12单片机LED_PWM调光
下一篇:嵌入式问题(codewarrior编译、下载程序)

推荐阅读最新更新时间:2024-03-16 13:53

extern和头文件
最近接手了一个项目的改进,其中一个任务就是对源代码进行优化。所以想把所有的文件整理成条理清晰,功能独立的一个个模块。而原先的程序当中,每一个简单的源文件都包涵了十几个头文件,因为一个头文件中包涵了其它的几个头文件,而其它的头文件又包涵了几个头文件。也许对于某一个源文件来说,这个头文件有必要包涵另外的几个头文件,可对于另外一些源文件来说却没有必要。而这样的结果就是编译连接后,每个源文件下都包涵了十几个头文件,最后成为了一张蜘蛛网,你连减都减不掉。我试着用申明外部函数的形式替换包涵头文件的形式,只能对几个简单的源文件进行了优化。 所以,想从这个问题入手,好好研究一下关键字 extern 和头文件。 查了一些资料和一些书。 exter
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved