extern用法解析

2 篇文章 0 订阅

要想搞清楚extern用法前,需对由多个文件组成的工程结构有一定的了解。把一个工程分为多个文件处理方式的好处有,功能模块化、并行开发和系统调试分开进行。每个功能模块主要分为两个文件,源文件(.c或者.cpp等)和头文件(.h)。头文件可以看做源文件的说明书,使用者不必知道实现的细节,但通过头文件即可使用。源文件就是集体的实现细节[1]。为此源文件和头文件有其标准的结构,源文件和头文件具体的文件结构如下[2]。

源文件各部分书写顺序(使用说明)

1. Header File Header Section---头文件描述(作者,修改日期,简要描述等)

2. Mult - Include-Prevent Section---防止头文件重复包含

3. Debug Switch Section

4. Include File Section

5. Macro Define Section

6. Struct Define Section

7. Prototype Declare Section

源文件各部分书写顺序(实现细节)

1.       Source File Header Section

2.       Debug Switch Section

3.       Include File Section

4.       Macro Define Section

5.       Structure Define Section

6.       Prototype Declare Section

7.       Global variable Declare Section

8.        File Static VariableDefine Section + Global variable DefineSection(原文可能有误,后者是我自己添加的)

9.       Function Define Section

由上面可知全局变量的定义一般只在源文件中。已源文件1和头文件1,源文件2和头文件2为例说明情况。如果在源文件1中有定义有全局变量i,要想在源文件2中使用源文件1中的全局变量i前,必须予以声明,声明就需用到extern。搞清楚下面问题前,弄清楚全局变量的声明和定义。

全局变量i定义有  extern int i = 0;

int i = 0;

int i;

全局变量变量i申明有

extern int i;

那为什么需要声明,可不可以不用声明?一定有要声明。我们知道各个文件首先经过相互独立编译,然后各个编译后文件模块链接形成可运行文件。如果源文件2对全局变量i的声明,则在编译源文件2过程中碰到变量i时会报错提示变量i没有定义。还有人说我现已知道了声明的原因,那么声明前可以不用加extern吗?如果不用声明前extern,则声明变为定义(extern int i 变为 int i),而同名称全局变量在整个工程中只能定义一次,文件独立编译时不过报错,但是链接报错提示变量i重复定义。至此说明了extern为什么在变量前使用理由。

extern还可用在函数前。函数声明和函数定义也要弄清楚。函数声明和定义有显著区别(定义有具体函数实现),extern可以可用或者不用。

函数display声明

     void display();

       extern  void display();

函数display定义;

    void display(){

       printf(“aa”);

}

extern void display(){

       printf(“aa”);

}

源文件1中有display函数的定义,同时头文件1中有函数声明。要想在源文件2中使用源文件1中函数display前,有两种方法。第一种方法是#include头文件1。第二种方法是可以直接在使用前对display函数进行声明。

 

[1] C语言模块化编程(我见过最好的) http://wenku.baidu.com/view/dd9827ebad51f01dc381f134.html

[2] C语言深度解剖,陈正冲,第七章,文件结构

【3】 百度百科http://baike.baidu.com/link?url=ov19G5FkFi8B5A49GCyagMOM2ZTUTfpxWMxqyRqOyGcG0KO285rU23TCUWSYRieu

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值