在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. const 使用方法具体解释

    const使用方法具体解释 面向对象是C++的重要特性.  可是c++在c的基础上新添加的几点优化也是非常耀眼的 就const直接能够代替c中的#define 下面几点非常重要,学不好后果也也非常严重 ...

  2. 第48篇-native方法调用解释执行的Java方法

    举一个native方法调用解释执行的Java方法的实例,如下: public class TestJNI { static { System.load("/media/mazhi/sourc ...

  3. Js apply 方法 具体解释

    Js apply方法具体解释 我在一開始看到javascript的函数apply和call时,很的模糊,看也看不懂,近期在网上看到一些文章对apply方法和call的一些演示样例,总算是看的有点眉目了 ...

  4. Format类及其子类功能和使用方法具体解释

    Format类及其子类功能和使用方法具体解释 1.   Format类结构: ·        java.lang.Object ·        java.text.Format ·         ...

  5. hbase-0.94安装方法具体解释

    先决条件:     1)java环境,须要安装java1.6以上版本号     2)hadoop环境.因为HBase架构是基于其它文件存储系统的,因此在分布式模式下安装Hadoop是必须的,可是,假设 ...

  6. ZooKeeper安装方法具体解释

    ZooKeeper安装方式分为两种,一种为单机模式.一个为集群模式,集群模式须要事先正确配置hadoop集群,安装方法參考hadoop-1.2.1安装方法具体解释 单机模式安装: 1.上传并解压zoo ...

  7. 模式识别 - libsvm的函数调用方法 具体解释

    libsvm的函数调用方法 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26261173 须要载入(load)SVM的 ...

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

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

  9. 第44篇-为native方法设置解释执行入口

    对于Java中的native方法来说,实际上调用的是C/C++实现的本地函数,由于可能会在Java解释执行过程中调用native方法,或在本地函数的实现过程中调用Java方法,所以当两者相互调用时,必 ...

随机推荐

  1. SuperSocket源码解析之启动过程

    一 简介 这里主要说明从配置系统引导启动SuperScoekt作为应用程序,且以控制台程序方式启动 二 启动过程 2.1 配置解析 从读取配置文件开始,直接拿到一个SocketServiceConfi ...

  2. SVN的trunk、branch、tag(二)

    转——简单的对比 SVN的工作机制在某种程度上就像一颗正在生长的树: 一颗有树干和许多分支的树 分支从树干生长出来,并且细的分支从相对较粗的树干中长出 一棵树可以只有树干没有分支(但是这种情况不会持续 ...

  3. WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]

    原文:WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇] 元数据的导出就是实现从ServiceEndpoint对象向MetadataSet对象转换的过程,在WCF元数据框 ...

  4. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  5. POJ 1287:Networking(最小生成树Kruskal)

    id=1287">Networking Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5976   Acce ...

  6. Random Teams

    n participants of the competition were split into m teams in some manner so that each team has at le ...

  7. loadrunner参数化总结

    Select next row:Sequential,Rondom,Unique Update value on:Each iteration,Each occurrence,Once 下面分别对这两 ...

  8. premake在Ubuntu和GCC环境下创建简单的C++工程

    由于premake基于lua脚本,为了方便编辑lua脚本,我在emacs24中利用package system安装了lua-mode. 然后创建config.lua文件,填入下面这段,主要来自:htt ...

  9. 621 - Secret Research

     Secret Research  At a certain laboratory results of secret research are thoroughly encrypted. A res ...

  10. Hadoop自定义Counter

    1.通过enum自定义Counter public static num LOG_PROCESSOR_COUNTER { BAD_RECORDS }; 2.在Mapper或者Reducer中操作Cou ...