在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的。要在此处引用”。(extern能够置于变量或者函数前,以标示变量或者函数的定义在别的文件里,提示编译器遇到此变量和函数时在其它模块中寻找其定义 )

大概extern  使用方法为例如以下几种方式:

其主要使用方法是:

  • 在此文件里声明别的文件的变量时用extern
  • 在cpp程序文件里用到c的库函数时用extern

头文件.h

extern volatile SERV103_LINK servLink;extern YaoXinStrucType *pstYx;static int ycSpace = 500;static int yxSpace = 1000;static int sjbgSpace = 10*1000;static int gzbgSpace = 30*1000;

然后须要在某个.cpp 文件里引用

某一个 .cpp (多个cpp)

iec103_serv_send_sjbg((SERV103_LINK *)&servLink ,sjbgData, 1);

ST_RET iec103_serv_send_zjbg(SERV103_LINK *servLink, SoeItemType *zjbgData, ST_UCHAR sendReason);

说明:我是在不同的cpp 中调用

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程序编译完毕后在目标代码中命名规则不同。

extern 使用方法具体解释相关推荐

  1. [转]extern使用方法总结

    Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义.谨记:声明可以多次,定义只能一次.在使用中,要形成一种风格. 函数的声明extern关键词是可有可无的,因为函数本身不加修饰的话就是 ...

  2. IP地址子网掩码位数换算方法及解释子网掩码的作用

    IP地址子网掩码位数换算方法及解释子网掩码的作用 子网位 /主机位 子网掩码 子网最大数 /主机最大数 2 /22 /10 | 255.192.0.0 2 /4194302 3 /21 /11 | 2 ...

  3. hive-0.11.0安装方法具体解释

    先决条件:     1)java环境,须要安装java1.6以上版本号     2)hadoop环境,Hadoop-1.2.1的安装方法參考 hadoop-1.2.1安装方法具体解释 本文採用的had ...

  4. extern使用方法总结

    1.谨记: 声明可以多次,定义只能一次. 2.函数 声明extern关键词是可有可无的,因为函数本身不加修饰的话就是extern.但是引用的时候一样需要声明的,方法1:声明放在头文件,#include ...

  5. extern使用方法总结!

    一.问题 Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义? 二.详解 1.函数的声明extern关键词是可有可无的,因为函数本身不加修饰的话就是extern.但是引用的时候一样需要 ...

  6. 基于vue2.0实现音乐/视频播放进度条组件的思路及具体实现方法+代码解释

    基于vue2.0实现音乐/视频播放进度条组件的方法及代码解释 需求分析: ①:进度条随着歌曲的播放延长,歌曲播放完时长度等于黑色总进度条长度:时间实时更新. ②:当滑动按钮时,实时更新播放时间,橙色进 ...

  7. 用画小狗的方法来解释Java中的值传递

    在开始看我画小狗之前,咱们先来看道很简单的题目: 下面程序的输出是什么? 如果你的回答是"小强",好,恭喜你答对了.下面我们改一下代码: 是的,我只是在changeName方法里面 ...

  8. 贝叶斯线性回归方法的解释和优点

    本文对比了频率线性回归和贝叶斯线性回归两种方法,并对后者进行了详细的介绍,分析了贝叶斯线性回归的优点和直观特征. 我认为贝叶斯学派和频率学派之间的纷争是「可远观而不可亵玩」的学术争论之一.与其热衷于站 ...

  9. 用java如何画动物_用画小狗的方法来解释Java值传递

    笔者的个人博客 Bridge for You 已经上线,欢迎大家前去坐坐,喝茶侃大山! (这篇文章好像挺受欢迎的,借势给自己的个人网站做做宣传 ("'▽'")) 前言 在开始看我画 ...

最新文章

  1. 服务器访问后不显示jsp,访问jsp服务器中遇到的问题
  2. Spring data redis乱码问题
  3. 《JavaScript权威指南第六版》学习笔记-JavaScript概述
  4. Powerdesigner数据库建模工具教程
  5. MySQL:为什么用limit时,offset很大会影响性能
  6. ue4 设置intellisence_UE4.22编辑器界面操控设置(4)
  7. php header()的用法
  8. 漫谈Google的Native Client(NaCl)技术(二)–技术篇(兼谈LLVM)
  9. 我的WCF之旅(10):如何在WCF进行Exception Handling
  10. 锐捷网络linux如何认证上网,如何在Linux里面进行锐捷认证上网
  11. 47-点分十进制表示法
  12. 微带线 带状线 过孔的时延对比
  13. html怎么修改版权信息,微擎修改免费版标题、logo、页脚版权信息教程(仅供学习)...
  14. 记将title(复杂字符串)放入URL时遇到的一些问题(`Model has no value for key ‘[‘`;重定向;中文乱码;URLEncoder;正则替换)
  15. 三年来我听过的耳机——顺便侃侃我的观念
  16. SpamSieve for Mac(垃圾邮件过滤软件)
  17. 如何解决Maven依赖冲突
  18. 新手学习单片机用什么软件模拟
  19. 电气绘图软件比较:CAD和Eplan的区别?
  20. (YOLOv3训练超详细教程)在Ubuntu 18.04下使用YOLOv3训练数据(提供源码及文件夹)

热门文章

  1. 简答面向数据报,面向字节流
  2. 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
  3. 通过syslog接收远程日志
  4. linux里source、. 、sh、bash、./有什么区别
  5. 一眼就能看懂的Java自学手册,终局之战
  6. 面试加分项!程序员工作2年月薪12K,附架构师必备技术详解
  7. css知识笔记(五)——css样式设置小技巧
  8. Struts2学习笔记(一)--入门常见配置
  9. Web渗透实验:基于Weblogic的一系列漏洞
  10. Eclipse External Tool Configration Notepad++