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



  • 相关阅读:
    ArrayList源码分析_JDK1.8.0_191
    LinkedList源码分析_JDK1.8.0_191
    HashMap源码分析_JDK1.8.0_191
    生产者消费者模型Java实现
    INT整型最小值取负还是本身的问题
    字节跳动面试题
    go sqlx操作数据库问题
    go gin框架调用cmd运行python脚本问题
    Android视频播放不能使用自研播放器
    mac python版本错误问题以及pip版本错误(anacanda)
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5179400.html
Copyright © 2020-2023  润新知