extern 的使用

“Ylmf OS:雨林木风的重磅系统运维炸弹“ 作为一款功能强大且易于使用的系统,Ylmf OS在系统运维方面提供了许多有用的功能和工具,以确保系统的稳定性和安全性。Ylmf OS的系统运维功能远不止于此,它还提供了许多其他强大的工具和功能,用于故障排除、性能优化和安全增强等方面。Ylmf OS提供了可靠的备份和恢复功能,帮助管理员保护重要的系统数据。Ylmf OS重视系统的安全性,并提供了一系列的功能来管理用户权限和保护系统免受潜在的威胁。Ylmf OS提供了简单而强大的网络配置和管理功能,使管理员能够轻松地设置和管理网络连接。三、安全性和权限管理。 阅读详情

   在一个比较大的工程中有时候需要在多个文件之间共享些全局变量。如何引用一个已经定义过的全局变量?

答:extern

可以用引用头文件的方式,也可以用 extern 关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错

  如果用extern方式需要在一个文件中定义变量,然后在其它文件中用extern 声明这些全局 变量。


比如有两个文件 a.c  b.c。  在a.c 里面定义变量 int var1.,在b.c里面用extern int var1.  

但这样做有时候会导致 编译到 b.c 的时候会提示 全局变量 未定义。把b.c里面的 extern int var1 修改为  int var1。再次编译则提示var1 重复定义。

通过分析Makefile 文件发现原来是编译顺序的问题,在这种情况下    哪个文件定义全局变量,哪个文件声明全局外部变量   是很重要的。

让 a.c 声明外部全局变量 extern  int var1,让b.c 定义全局变量 int var1,再次编译顺利通过。


       另外前几天做了一个机遇uCos-II 的项目,注意到在文件 ./source/ucos_II.h 里面的变量都是全局变量的定义,都是这么定义的:

OS_EXT  OS_TCB           *OSTCBCur;                        /* Pointer to currently running TCB         */
OS_EXT  OS_TCB           *OSTCBFreeList;                   /* Pointer to list of free TCBs             */
OS_EXT  OS_TCB           *OSTCBHighRdy;                    /* Pointer to highest priority TCB R-to-R   */
OS_EXT  OS_TCB           *OSTCBList;                       /* Pointer to doubly linked list of TCBs    */

这里的 OS_EXT   是个关键字。当不同的文件include  ucos_II.h 的时候 OS_EXT关键字代表不同的含义,一般在main函数里面都是这么写:

#define		OS_GLOBALS
#include "source/ucos_II.h"

而在 ucos_II.h 文件里面有如下代码:

#ifdef  OS_GLOBALS
#define  OS_EXT
#else
#define  OS_EXT  extern
#endif
也就是在main.c 里面定义了宏   OS_GLOBALS , ucos_II.h 里面的全局变量,而在其它文件 include  ucos_II.h 没有定义这个宏,就相当于用extern 声明这些变量。


 此外,extern修饰符可用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同


1.extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。

2.如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有区别:

extern void print_externifo(); 和void  print_externifo();


extern在 函数中的使用:

如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。

如果你不想包含头文件,那么在c/cpp中声明该函数。一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用“extern”,这样在本文件中


调用别的文件定义的函数就不用包含头文件include“*.h”来声明函数,声明后直接使用即可。


举个例子:

#vim  print_extern.c  

#include <stdio.h>  

extern void print_extern()//这里用不用extern都可以  

{  
	printf("helloextern test!!\n");  
}   


$vim extern_test.c  

#include <stdio.h>  

extern void print_extern();//其实这里用不用extern都是可以的  

main()  
{  
	print_extern();  
} 

    $gcc –c print_extern.c –o print_extern.o  
      
    $gcc print_extern.o extern_test.c –o extern_test  
      
    $./extern_test  


extern的使用 在 CLR 源码中有很多的 和 这样的关键词,比如下面这些代码: 那这些都是什么意思呢? 为了更好的学习 CLR,这些还是要简单了解一下的。在 C# 中并没有听说过有 这种概念,其实变量可以有两种方式存在。变量定义变量引用变量定义概念很简单,定义就得给它分配内存空间,比如下面这样: 接下来看下 ,它其实和 以及 C# 的 概念相似,即把其他文件中的变量引入到本文件,目的就是为了使用,比如在 文件下定义了一个 文件,截图如下:为了能够在 中使用 ,那怎么办呢? 这时候就需要用 ext 阅读详情

相关推荐

Unity3D安装:离线安装 Unity

Unity 下载助手 (Download Assistant) 支持离线部署。在这种部署方式中,可下载用于安装 Unity 的所有文件,然后生成脚本以便在未接入互联网的其他计算机上重复相同的安装。运行下载助手,并在一台计算机上正常安装 Unity。此计算机必须有足够的可用磁盘空间来下载所有文件。单击下拉选单并选择 __Custom__,然后选择要将文件下载到的位置。打开 PC 的文件管理器,导航到之前指定的自定义位置文件夹,然后在该文件夹内查找。整理翻译,转载请注明出处!

ygtu2018的博客 3254

C语言 #define与extern的区别

define用来定义常量,其格式为#define NAME n,表示用NAME代替n,其中n为常量,注意该表达式后面没有分号。extern用来定义全局变量或声明函数。

m0_57894994的博客 1337

Zabbix监控网络设备讲解

Zabbix监控网络设备讲解 本人在研究学习zabbix的时候,网上找过很多如何监控路由,交换,或者是防火墙的文章,但很多都比较散,这里我出一个大概的整合,方便大家参考和学习。本章就拿华三的交换机来做文章。 监控网络设备首先我们需要开启snmp协议,华三怎么开启snmp协议在我的博客里有写到,其次就是找到版本对应的OID,zabbix就是通过抓取设备的OID来做到监控网络设备的,当然zabbix也不仅仅只有通过snmp来监控设备,还有很多别的功能,这些功能我会在以后的博客里面一一更新 文章目录Zab

太阳了文哥的博客 3381

extern和头文件的区别

参考:https://blog.youkuaiyun.com/qq_38880380/article/details/81474580 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。 1. extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v...

BJUT_bluecat的博客 2776

RT-Thread与LWIP协议栈在GD32F450XX上的移植实战:从FreeRTOS到RT-Thread的切换指南

本文详细介绍了将LWIP协议栈从FreeRTOS移植到RT-Thread系统,并在GD32F450XX开发板上实现的完整实战指南。重点解析了sys_arch适配层、邮箱与信号量接口的关键改造,以及网络驱动ethernetif.c的适配步骤,帮助开发者解决线程通信差异,实现稳定网络连接。

linux6sysadmin的博客 824

SAP 联产品测试

最近领导一直要求研究一下SAP联产品的使用场景,之前只是自己摸索过一次,这个重新对联产品进行一个测试。 1、首先准备好物料主数据 注意主数据中需要勾选联产品标识。 设置好物料的分摊的百分比。 2、检查BOM 在BOM中也需要维护联产品的标识 只有当组件数量未负数时,才能勾选联产品的标识。如果组件数量正值,勾选联产品的标识时会报错。 3、我们创建生产订单 可以看到按正常的生产订单下达时,系统就报错了,问题点在于离散制造的生产订单基本是结算到物料的。但是联产品是按订单结算的, 所以需要对订单类型中的结算参

我小时候很黑的博客 2108

extern和static、#define和typedef

extern extern修饰全局变量 extern在一个文件内扩展全局变量的作用域(这种情况要发挥其作用的话不能被省略) 将全局变量的作用域扩展到其他文件(可以省略, 一般不写) extern修饰函数(可以省略,一般不写) 在一个工程中 修饰全局变量, 将全局变量的作用域限制在本文件 修饰局部变量, 改变局部变量的生命周期(将局部变量存储在静态区) 区别 (1)#define之后不带分号,typedef之后带分号。(2)#define可以使用其他类型说明符对宏类型名进行扩展,而 typ

2021wuwei 943

学Simulink--环境感知场景实例:基于Simulink的毫米波雷达多目标跟踪仿真

本文介绍了基于Simulink的毫米波雷达多目标跟踪仿真系统,重点分析了FMCW雷达信号处理流程(Range/Doppler FFT、CFAR检测)和多目标跟踪算法(JPDA数据关联、EKF状态估计)。通过构建城市道路交叉场景,验证了系统在跟踪精度(位置误差<0.2m)、实时性(单帧处理24ms)和鲁棒性(ID切换率<5%)方面的性能优势,并提出了UKF滤波、多传感器融合等优化方向。该仿真系统为自动驾驶环境感知提供了实用的毫米波雷达跟踪解决方案。

amy_mhd的博客 92

linux发行版_2020年最漂亮的7个Linux发行版

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言对于想学习Linux的朋友们,心中一定有疑问,哪个Linux版本比较好入门,Linux有图形界面吗?答案是有的,您可以获取类似windows界面的的Linux发行版。只需要拥有一台旧电脑就可以,您甚至可以使用轻量级Linux发行版,在古董级的PC上也可流畅运行。在本文中,我将只关...

weixin_39846664的博客 452

webrtc进阶-- FlexFEC 实现原理与调试分析(m80 代码对齐版)

WebRTC 中 FlexFEC 技术解析与调试指南 摘要:本文深入分析 WebRTC 的 FlexFEC(灵活前向纠错)技术实现原理,重点探讨其在 m80 版本中的协商机制、接收侧恢复流程以及 SFU 场景下的特殊处理。文章指出 FlexFEC 通过动态冗余策略提升弱网抗丢包能力,详细解析了编解码器分配、SSRC 映射、包恢复等关键环节,并提供了针对 XR+SFU 场景的调试建议。调试时可重点关注 FEC 包接收与媒体包恢复日志,以验证链路有效性。

HOSTEN的博客 48

ESP32-C3入门教程 环境篇③——VS Code IDE快速入门

文章目录一、安装Visual Studio Code二、安装扩展三、配置ESP-IDF 插件四、创建工程五、配置工程5.1 选择目标芯片5.2 项目配置六、编译工程七、固件分析七、固件下载八、串口日志九、单步调试 一、安装Visual Studio Code 下载并安装Visual Studio Code 二、安装扩展 左侧扩展 搜索espressif 点击安装 三、配置ESP-IDF 插件 按下F1按键 输入configure esp-idf extension EXPRESS,如果你

8302

关于FOUNDATION_EXTERN、extern、FOUNDATION_EXPORT、extern "C"的区别

大家都知道Xcode的编译器是能够识别C++语言编程代码的,所以在编程中也是要考虑到C++的 首先直接上代码看一下几种宏的定义 #if defined(__cplusplus) #define FOUNDATION_EXTERN extern "C" #else #define FOUNDATION_EXTERN extern #endif 由以上定义可以看出 FOUNDATION_

暗黑的博客 7051

《C/C++等级考试(1~8级)历届真题解析》专栏总目录

中国电子学会《全国青少年软件编程等级考试》C/C++编程(1~8级)历届真题解析。订阅后可阅读专栏内所有真题解析,真题持续更新中!

人生就是一个不断学习的过程 2万+

extern使用方法总结

extern使用方法总结

weixin_49934173的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

extern总结

extern "C" 在C++引用lua的头文件时,我们总会写成: extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } 为什么要这么做呢?原因是C++的编译器会对程序中符号进行修饰,这个过程在编译器中叫符号修饰(Name Decoration)或者符号改编(Name Man...

Hustle Everyday 1096

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

extern使用小结

extern

知行合一 1772

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

extern函数_extern关键字作用

1、extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。extern声明不是定义,即不分配存储空间。也就是说,在一个文件中定义了变量和函数, 在其他文件中要使用它们, 可以有两种方式:使用头文件,然后声明它们,然后其他文件去包含头文件;在其他文件中直接extern。2、extern C作用链接指示符extern C如果程序员希望调用其他程序设计语言尤其是C ...

weixin_29054523的博客 4390

【C++】extern “C“ 和 extern 深度探索

本文介绍了C和C++中extern关键字的用法及其在链接阶段的作用。extern用于声明在其他文件中定义的全局变量或函数,实现跨文件共享。extern "C"则是C++特有的用法,用于指示编译器按照C语言的链接规则处理代码,解决C++与C语言的链接兼容性问题,避免名称修饰带来的链接错误。文章还探讨了extern在修饰const变量时的注意事项,以及extern "C"影响本文件符号导出的细节。此外,还讨论了extern "C"对普通类型和C++类型符号导出的影响,以及extern "C"的正确使用方式。

杨翔裕的博客 2122

extern使用方法总结!

 extern   在源文件A里定义的函数,在其它源文件里是看不见的(即不能访问)。为了在源文件B里能调用这个函数,应该在B的头部加上一个外部声明:     extern   函数原型;     这样,在源文件B里也可以调用那个函数了。     注意这里的用词区别:在A里是定义,在B里是声明。一个函数只能(也必须)在一个源文件里被定义,但是可以在其它多个源文件里被声明。定义引起存储

cameracanon的专栏 12万+

C++声明extern变量和extern函数的用法

在与头文件名称相同的.cpp文件中定义和实现函数体,比如:test.cpp,test.cpp中必须引用test.h;/*extern*///定义外部变量、外部变量初始化//定义外部函数。实现外部函数的方法要养成正规的编程习惯,变量、函数、结构体、类的声明要放在.h文件中,比如test.h;结构体和类体的实现可以放在test.h文件中,但不要初始化。把变量的初始化、函数方法的实现、结构体的实现、类体的实现放在另一个.cpp文件中,这个.cpp文件默认的要与.h文件同名,比如test.cpp。

wenchm的博客 7783

extern用法

1.extern+变量,extern+函数 extern 最简单的用法就是在一个文件中引用另一个文件中的变量或者函数。 首先我们要知道一个概念:声明可以有多次,定义只能有一次。 1.1extern+变量 先来谈谈extern+变量。 ① int a; ② int a = 0; ③ extern int a = 0; ④ extern int a; 对于①②③来说,都是定义一个变量。而且②和③效果一摸一样,都是定义一个变量a并且初始化为0。 对于④来说,这是一个声明。声明其他文件有这个变量。随便写一个函数,外

yi_chengyu的博客 5477

extern

1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的

ido911 822

FOUNDATION_EXTERN与UIKIT_EXTERN

Xcode进行APP项目开发,在项目开发工程中经常使用宏定义,如下使用: FOUNDATION_EXTERN NSString *const LHserId; UIKIT_EXTERN const NSInteger LHCount; 这些宏定义的前缀,FOUNDATION_EXTERN与UIKIT_EXTERN有什么区别呢? 1、首先看下FOUNDATION_EXTERN的定义: #if de...

哈皮吖的博客 1073

extern的用法

C语言中extern的用法 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面...

Hacker_LiuSX的博客 7769
上一篇: 一个Linux下C线程池的实现
下一篇: 在64位linux下编译32位程序
xianjian_x
博客等级 码龄14年 231粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值