C语言学习之extern关键字

article/2025/9/24 13:45:03

1.了解extern

        1.extern是C语言的一个关键字,可以用来修饰函数与变量

        2.当extern修饰一个变量或函数时时,就是在声明这个变量(函数),告诉编译器在外部文件中已经这个变量(函数),要通过编译。 

 2.extern的用法

        1.在一个文件中引用其他文件的变量

        当我们一个项目中有多个.cpp文件时,往往需要在其中一个文件中使用另一个文件中定义的变量,如果我们直接使用,编译器就会报错: 

e462e8e09460434e80048850c3c514f3.png

由于编译文件1的时候编译器不认识g_val,以此编译失败

        这时我们就可以使用extern,如下:

//文件1.cpp代码#include<stdio.h>
extern int g_val;    //声明外部符号g_val
int main()
{printf("%d", g_val);
}//文件2.cpp代码
int g_val = 10;

        这时,代码就可以成功运行起来,打印出g_val的值。

        2.在一个文件中引用其他文件的函数

        对于函数,也是同理,当需要使用外部文件定义的函数时,需要使用extern关键字进行声明:

//文件1.cpp代码
#include<stdio.h>
extern void show();    //声明外部符号show()
int main()
{show();
}//文件2.cpp代码
#include<stdio.h>
void show()
{printf("hello world");
}

运行结果如下:

hello world        

3.extern的注意事项

        在使用extern时我们可能会写出这样的代码 :

//文件1.cpp代码#include<stdio.h>
extern int g_val=10;
int main()
{printf("%d", g_val);
}//文件2.cpp代码
int g_val = 10;

上述代码是在引用外部变量g_val的时候同时对它进行赋值,当我们运行时,编译器就会报错,这个错误是在链接的时候发生的错误,为“找到一个或多个多重定义的符号” 。 


        产生错误的原因时什么呢 ?这就不得聊到定义与声明了。

        1.什么定义:

        定义是给变量或函数分配内存空间,在这同时可以为变量赋初值。

        2.什么是声明:

        声明是用来告诉编译器变量的名称和类型,使编译器知道存在着这个变量和类型,且不分配内存。

        3.结论

        由此我们可以得出以下两种结论:

        1.定义会对变量分配内存空间,而声明不会

        2.由于一个变量的存储空间是唯一的,因此定义不能重复定义,而声明可以重复声明。


         由此可以得出,当我们使用extern修饰变量且对它进行赋值的时候,这条语句就不是在对变量进行声明了,而是定义,因为声明一个变量编译器是不会分配内存空间的,而对于一个不存在的内存空间进行赋值操作,显然是不合理的。

        而当我们进行定义的时候,编译器在编译的时候并不会发现错误,但在多文件进行链接时,就会发现g_val这个全局变量同时在1.cpp和2.cpp进行定义,报出了重定义的错误。

4.extern与include

        1. include

        当我们有多个文件需要大量引用外部变量或函数的时候,如果使用extern,我们就需要在多个文件中大量使用extern,这样做效率显然会降低,代码也显得太过LOW。因此,我们通常将所有的全局变量和常用全局函数都写在一个.cpp文件中,然后用同名的.h文件放这些变量与函数的声明(即头文件),这样其他文件需要使用外部变量和函数时,就只需要包含其中的头文件即可,显得高效又简洁。如:

//文件1cpp代码
#include "2.h"
int main()
{show();printf("%d", g_val);
}//文件2.cpp代码,用于定义与实现
#include "2.h"
int g_val = 10;
void show()
{printf("hello world");
}//文件2.h代码,用于声明
#pragma once           //防止重复包含
#include<stdio.h>
extern int g_val;
void show();

这样,当我们需要使用2.cpp中的变量和函数时,就不需要再使用extern声明了

        2.extern的好处

        想必会有读者有疑问,include那么方便,那我们的extern关键字是不是没有用了?实则不然。原因如下:

        1.当头文件中有大量的变量与函数时,如果我们只需要其中的少量变量或函数时,我们使用include包含,显然会引入大量不需要的无关函数与无关变量,这样无疑会减慢程序预处理的过程,此时使用extern就可以有效缩短时间。

        2.在大工程中,一个头文件中经常会包含其他的头文件,这样层层嵌套下来,如果没有进行处理,往往会出现一个.c文件重复包含相同头文件的情况,而使用extern就不会出现这种情况。(当然,如果头文件进行适当的处理如“条件编译”,也能有效地避免重复包含的现象,这里先暂时不做详细讨论)


制作不易,能否点个赞再走呢qwq


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

相关文章

extern关键字的一般用法

extern关键字会提升变量或者函数的逼格&#xff0c;使得它们可以跨文件被访问。话虽然是这么说&#xff0c;使用这个关键字必须要注意一些东西。 首先&#xff0c;你得在cpp文件里面实现这些全局变量和全局函数&#xff0c;这是最基本的&#xff0c;然后只需要在需要用到这些变…

C++中的extern

文章目录 extern的含义修饰全局变量修饰全局常量修饰局部变量修饰字符串C代码C代码 想必大家都知道&#xff0c;在C中&#xff0c;想要生成一个可执行文件&#xff08;exe&#xff09;或者动态链接库&#xff08;dll&#xff09;&#xff0c;需要经过编译和链接两个步骤&#x…

extern使用方法总结!

一、问题 Extern的问题在于不知道这个关键词出现的时候到底是声明还是定义&#xff1f; 二、详解 1、函数的声明extern关键词是可有可无的&#xff0c;因为函数本身不加修饰的话就是extern。但是引用的时候一样需要声明的。 2、全局变量在外部使用声明时&#xff0c;extern关键…

extern详解

extern——关键字 extern是C语言中的一个关键字&#xff0c;一般用在变量名前或函数名前&#xff0c;作用是用来说明“此变量/函数是在别处定义的&#xff0c;要在此处引用”&#xff0c;extern这个关键字大部分读者应该是在变量的存储类型这一类的内容中 遇到的&#xff0c;…

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

一、定义和声明的区别 声明&#xff1a;用来告诉编译器变量的名称和类型&#xff0c;而不分配内存&#xff0c;不赋初值。 定义&#xff1a;为了给变量分配内存&#xff0c;可以为变量赋初值。 注&#xff1a;定义要为变量分配内存空间&#xff1b;而声明不需要为变量分配内…

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

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

达梦AWR使用

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

AWR(性能报告)

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

AWR2243

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

awr报告

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

awr清理

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

AWR

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

达梦 awr

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

ORACLE调优深入理解AWR报告

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

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

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

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

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

AWR概念原理涉及表和包

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

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

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

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

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

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

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