extern 使用方法具体解释

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



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET常用工具类集锦

不错的地址: http://www.cnblogs.com/flashbar/archive/2013/01/23/helper.html https://github.com/chrisyanghua/MyHelper/tree/master/MyHelper http://www.cnblogs.com/conan87810/archive/2009/03/15/1412529.html http://www.cnblogs.com/ltp/archive/2008/03…

现代控制理论-李雅普诺夫

现代控制理论-李雅普诺夫 单输入单输出系统(BIBO)的系统函数如下: 则,该系统的能控标准型(能空性)为: 能观性: 李雅普诺夫下的稳定性: 李雅普诺夫下的渐进稳定性&a…

Linux服务器的gou,开源跨平台移动项目Langou【简介】

Langou简介Langou是一个跨平台(Android/iOS)前端开发框架,核心代码使用C编写,底层基于OpenGL绘图,上层实现了一个精简的排版引擎以及一个JS/JSX运行环境。目标是想实现在此基础上开发GUI应用程序可兼顾开发速度与运行效率。暂时只支持iOS与An…

caffe 错误

一些caffe错误 训练时很快梯度爆炸,loss猛增至nan 如果找不到数据上的原因的话,可以怀疑caffe框架有问题,换用其它版本试试。比如我遇到的问题是在训练时使用了Accuracy层,而该层的实现代码在某次更新中GPU代码存在bug&#xff0c…

发手气红包算法

lowest0.01元,最小金额 操作是整数,最小人民币单位是分,所以有2位小数,最少是0.01元 发金额totalBill 发n人,就取1到100的随机数n个 为了提高精度,把金额放大100倍 totalAmounttotalBill*100 n个人各取的随…

cs106a编程方法学作业解答(3)

此次作业要求我们做一个简单的打砖块游戏。 1 * File: Breakout.java2 * -------------------3 * Name:4 * Section Leader:5 * 6 * This file will eventually implement the game of Breakout.7 */8 9 import acm.graphics.*;10 import acm.program.*;11 import acm.ut…

vue从入门到进阶:简介(一)

前言 用了这么久的vue了,但是一直没有时间写个系列文章,现在抽一定时间总结下vue的知识点。 首先,Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器。下面总…

linux堡垒机开源软件,Jumpserver开源堡垒机

Jumpserver开源跳板机系统部署1.简介Jumpserver使用Python / Django进行开发,遵循Web 2.0规范,配备了业界领先的Web Terminal解决方案,交互界面美观、用户体验好。Jumpserver采纳分布式架构,支持多机房跨区域部署,中心…

node截图服务可用性报告

2019独角兽企业重金招聘Python工程师标准>>> 前言 服务器端截图可以做什么? 个人观点:省去跟报表有关的EDM开发,直接从系统上截图,然后发图片给用户就搞定。剩下的自己脑补。 既然这么好,为毛不赶紧弄。…

C++的extern关键字

extern是一个声明,不是一个定义,A模块想应用B模块的一个函数或者变量,A模块包含B模块的头文件,并且在变量或者头文件前,加 extern,虽然编译的时候,找不到模块的定义,但是在连接的时候…

Linux网站访问的电脑占CPU,详解Linux如何查看当前占用CPU或内存最多的几个进程...

命令ps -aux | sort -k4nr | head -N命令详解:1、head:-N可以指定显示的行数,默认显示10行。2、ps:参数a指代all——所有的进程,u指代userid——执行该进程的用户id,x指代显示所有程序,不以终端…

Hi,博客园

Hi,博客园! 这是我在博客园的第一篇博文,主要是为了测试发布。 在以后的日子里我会陆续介绍ArcGIS soft的使用及Flex和JS的开发,以及开源GIS的开发,敬请关注。转载于:https://www.cnblogs.com/unitgis/p/4028171.html

java反射快速入门(二)

上一遍博文 , 简单介绍java 反射的常用接口,本遍博文, 我会结合项目开发的实际例子讲解下 java反射的使用 现在有个需求, 要将一个对象转换成xml格式, 或者将一串xml转换一个对象, 这时我们循序渐进, 先从最简单的入手 一: 方案① 场景 : NBA球员信息描述…

Myecplise Tomcat 启动很慢

今天突然遇到一个问题,tomcat在Myecplse启动非常慢,直接用tomcat自带的start.bat启动很快,如果通过Myeclipse启动会发现项目一直在实例化,最后发现是因为加了断点调试,断点忘了去掉了,这个恰恰影响了spring…

C#QQ邮箱验证

注意: QQ邮箱的简单邮件传输协议(SMTP)使用了SSL加密,必须启用SSL加密、指定端口。 QQ邮箱POP3/SMTP服务默认是关闭的,需要开启服务(设置>账户>开启服务)。 QQ邮箱若有独立密码&#xff0…

linux 文件 重命名 缓存,linux – rename()原子性和NFS?

参考:Is rename() atomic?我问的是类似的东西,但不完全相同,因为我想知道的是在使用NFS时依赖于rename()的原子性是否安全?这是我正在处理的一个场景 – 我有一个必须始终存在的’索引’文件.所以:>客户端创建一个新文件>客户端通过“…

Win2008上.NET4.0部署出错HTTP 错误 500.21 - Internal Server Error的解决方法

原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装 解决:开始->所有程序->附件->鼠标右键点击“命令提示符”->以管理员身份运行,输入以下命令: %windir%\\Microsoft.NET\\F…

ORACLE DATAGURARD配置手记

经过多次实践,参阅网上N多文章……最后还是配不成,可能本人悟性太低,无法体会高手的笔记。最终还是在前辈的帮助下完成。特用最平实的手法记录下来,以便如吾辈菜鸟能 看得懂。 运行Data Guard的条件 1、 在主库和从库的所有机器上…

浅谈ASP.NET框架

本篇文章更适合具有一定开发经验,一定功底,且对底层代码有所研究的朋友!!! 本篇文章稍微偏原理且底层,有一定难度和且比较晦涩,文章粒度稍微粗些,更细粒度的,会在后续的文…

C语言之冒泡排序

假设要对含有n个数的序列进行升序排列,冒泡排序算法步骤是: 1、从存放序列的数组中的第一个元素开始到最后一个元素,依次对相邻两数进行比较,若前者大后者小,则交换两数的位置; 2、第1趟结束后,…