关闭

extern用法解析

882人阅读 评论(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

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:25997次
    • 积分:494
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:5篇
    • 译文:0篇
    • 评论:0条