【014 关键字】一文彻底搞懂extern用法

article/2025/9/24 13:38:51

一、定义和声明的区别

声明:用来告诉编译器变量的名称和类型,而不分配内存,不赋初值

定义:为了给变量分配内存,可以为变量赋初值

注:定义要为变量分配内存空间;而声明不需要为变量分配内存空间。


二、extern用法

extern是一种“外部声明”的关键字,字面意思就是在此处声明某种变量或函数,在外部定义

2.1 extern 函数

为什么要用extern 函数呢?直接#include相应的头文件不可以嘛?

例子,如b.c 想调用a.c 中的fun函数,有两种方法:

方法1:include 头文件,即直接 #include "a.h" 

方法2:  extern 方法 ,extern void fun(...)这句在调用文件中使用,表示引用全局函数fun(),当然,函数默认是全局的。

优点:不inlcude delayms.h就不会引入大量头文件,进而不会引入大量的无关函数。这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。 在makefile中需要led.o和delay.o写在一起,否则link的时候找不到delayms而报错。

2.2 extern 变量

如果文件b.c需要引用a.c中变量int v,就可以在b.c中声明extern int v,然后就可以引用变量v。能够被其他模块以extern修饰符引用到的变量通常是全局变量。注意,extern int v可以放在a.c中的任何地方,具体作用范围和局部变量相同。

extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”

2.3 在C++文件中调用C方式编译的函数

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

2.4 注意:声明可以多次,定义只能一次。

extern int i; //声明,不是定义
int i; //声明,也是定义

三、通俗讲解

1. 无论是否有extern修饰,赋初值便是定义。如下两种方式是等价的,必为定义!!!

//如果在声明的时候给变量赋值,那么就去掉extern直接定义变量赋值是等价的
extern int a = 10;//尽量不要写这种定义方式
int a = 10;//上述两条语句等价

2.  int a; 是声明?还是定义?

🍍 在函数内部:

int a;// 定义,作为局部变量分配了空间

extern int a;// 声明

🍍 在函数外部与在头文件中:

int a;// 全局变量,声明兼未初始化定义,详见参考文献

extern int a;// 声明


四、参考内容

在源文件(.c)和头文件(.h)中声明和定义的区别——C语言 - 蓝海人 - 博客园

https://bbs.csdn.net/topics/390343133 

 


http://chatgpt.dhexx.cn/article/FIPknoOV.shtml

相关文章

HDU AWR电磁场与微波实验 操作记录

类型 滤波器版图设计功放设计IV曲线创建偏置电路&添加原理图背面注释添加谐波平衡端口添加双音激励端口 实验课需要使用这款软件 记录一下,提醒自己如何操作 工程文件如下 ,0积分 滤波器. 版图. 功放. 交指滤波器. 滤波器 • Creating a schematic …

达梦AWR使用

DBMS_WORKLOAD_REPOSITORY 包 1、概述 AWR默认是关闭的需要受到开启,如 果 需 要 开 启 , 则 调 用 DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL 过 程 设 置 快 照 的 间 隔 时 间 。 DBMS_WORKLOAD_REPOSITORY 包还负责 snapshot(快照&…

AWR(性能报告)

本文章为网络笔记,看了warehouse老师的视频受益匪浅,更是感觉自己技术太过初级,特写了本笔记,方便以后反复学习! 如有任何不妥,请发邮件至102448567qq.com删除文章! 关于warehouse: …

AWR2243

TDA2xx-AWRx243 TI毫米波板(代完善更新和作者的继续研究) 1、安装mmwave studio和驱动(链接: https://download.csdn.net/download/weixin_42501561/19775644 ) 2、设置网络端口IP地址(如果不能更改路由器I…

awr报告

某客户反馈数据库慢,给到一份awr报告。分析如下 每个cpu可用处理时间3501.6s(59.86min),系统负载为:511(59.86*16)50%,其中16为CPUs direct path read最高,可能有下面三种原因: parallel query大量disk排序table预读取…

awr清理

Oracle并没有真正进行删除AWR报告信息,查询metalink发现是Oracle的bug, Bug 8622802描述了这个问题, 修复版本: #禁用awr报告 EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL > 0); select * from WRM$_SN…

AWR

AWR自动工作量资料档案库: AWR用于收集关于该特定数据库的操作统计信息和其他统计信息,oracle以固定的时间间隔(默认60分钟)为其所有重要统计信息和负载信息执行一次快照,并将这些快照存储在AWR中。这些信息在AWR中保留给定的时间…

达梦 awr

AWR 全称为自动工作集负载信息库(Automatic Workload Repository) ,采集数据库的性能相关数据,用来分析数据库性能问题,方便调优工作。 达梦中 awr 功能默认是关闭的,另外 mpp 集群不支持 awr 开启 AWR 功能 检查 awr 开启状态 达梦提供了 SF_CHECK_AW…

ORACLE调优深入理解AWR报告

什么是AWR? 一堆历史性能数据,放在sysaux表空间上,AWR和sysaux都是10g出现的,是oracle调优的关键特性。 默认快照间隔1小时;10g保存7天;11g保存8天; 可以通过DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SE…

AWR射频仿真基本操作(一)

这里只讲述一个基本的操作: 软件是AWR 14版本 新建工程 File–New project 然后File-project as 即另存为新建一个工程,自己取好名字。 设置基本参量 AWR可以直接进行仿真频率和单位之类的基本设置。 如果你只需要基本的S参数仿真,那么…

理论实践:循序渐进理解AWR细致入微分析性能报告

理论实践:循序渐进理解AWR细致入微分析性能报告 黄凯耀 (Kaya) ACOUG核心会员,高级技术专家 曾经工作于Oracle Real World Database Performance Group,一个隶属于Oracle公司总部数据库产品管理的核心团队。大学及研究生时期专注于Linux应用开…

AWR概念原理涉及表和包

一:AWR概念 Oracle10g以后,Oracle提供了一个性能检测的工具:AWR(Automatic Workload Repository 自动工作负载库)这个工具可以自动采集Oracle运行中的负载信息,并生成与性能相关的统计数据。我们可以根据这…

三种编码方式(费诺曼编码,霍夫曼编码,哈夫曼树编码)的简单解释和介绍

一. 费诺曼(Fano)编码是一种前缀编码,其基本原理是将出现频率较高的符号用短的编码表示,而出现频率较低的符号则用长的编码表示。通过这种方式进行编码,可以达到更好的压缩效果。 费诺曼编码的具体过程如下: 将要编码的符号按照…

霍夫曼编码及解码(简单实现)

霍夫曼树 霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。 所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。 树的路…

霍夫曼树和霍夫曼编码原理

一、哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子。 判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换…

学习笔记--霍夫曼树与霍夫曼编码解码

先摘一下百科的说法 “哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字&#x…

霍夫曼编码的matlab实现

霍夫曼编码的原理已经有很优秀的介绍博客了,给出现频率高的灰度级分配更短的码字无非就是利用数学中逆序乘积和最小的原理,具体的原理介绍我就不再赘述了。这里给大家分享一下我个人早先实现的霍夫曼编码matlab程序。废话不多说,直接上代码&a…

霍夫曼树和霍夫曼编码以及霍夫曼编码的应用

文章目录 霍夫曼树介绍1.1霍夫曼树的定义1.2霍夫曼树的几个概念1.3构建霍夫曼树的过程1.4代码实现霍夫曼树 霍夫曼编码介绍什么是霍夫曼编码通信领域的应用 字符串压缩1.构造霍夫曼树2.生成赫夫曼树对应的赫夫曼编码表3.通过生成的赫夫曼编码表,返回一个赫夫曼编码 …

霍夫曼编码判断

霍夫曼编码判断 (算法学习) 霍夫曼编码一定是前缀编码,即,没有任何一个编码是另一个编码的前缀。 此外,还需要明白霍夫曼编码构建的树中只有度为0和2的结点,不存在度为1的结点。这与玩全二叉树是不一样的概念,玩全二…

霍夫曼编码和LZ编码

文章目录 一、霍夫曼编码1.概念及编码步骤2.霍夫曼编码例题分析 二、LZ编码1.概念及编码步骤2.LZ编码例题分析 一、霍夫曼编码 1.概念及编码步骤 霍夫曼编码是定长到变长编码,其概率高的符号映射成较短的二进制序列,概率低的符号映射成较长的二进制序列…