C语言extern关键字(去使用外部全局变量、函数)

参考:C语言正确使用extern关键字
作者:xingjiarong
发布时间:2015-08-14 08:37:33
网址:https://blog.csdn.net/xingjiarong/article/details/47656339

目录

  • 1、引用同一个文件中的变量
  • 2、引用另一个文件中的变量
  • 3、引用另一个文件中的函数

利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数,下面就结合具体的实例,分类说明一下。

1、引用同一个文件中的变量

#include<stdio.h>int func();int main()
{func(); //1printf("%d",num); //2return 0;
}int num = 10;int func()
{printf("%d\n",num);
}

如果按照这个顺序,变量 num在main函数的后边进行声明和初始化的话,那么在main函数中是不能直接引用num这个变量的,因为当编译器编译到这一句话的时候,找不到num这个变量的声明,但是在func函数中是可以正常使用,因为func对num的调用是发生在num的声明和初始化之后。

如果我不想改变num的声明的位置,但是想在main函数中直接使用num这个变量,怎么办呢?可以使用extern这个关键字。像下面这一段代码,利用extern关键字先声明一下num变量,告诉编译器num这个变量是存在的,但是不是在这之前声明的,你到别的地方找找吧,果然,这样就可以顺利通过编译啦。但是你要是想欺骗编译器也是不行的,比如你声明了extern int num;但是在后面却没有真正的给出num变量的声明,那么编译器去别的地方找了,但是没找到还是不行的。

下面的程序就是利用extern关键字,使用在后边定义的变量。

#include<stdio.h>int func();int main()
{func(); //1extern int num;printf("%d",num); //2return 0;
}int num = 10;int func()
{printf("%d\n",num);
}

2、引用另一个文件中的变量

如果extern这个关键字就这点功能,那么这个关键字就显得多余了,因为上边的程序可以通过将num变量在main函数的上边声明,使得在main函数中也可以使用。

extern这个关键字的真正的作用是引用不在同一个文件中的变量或者函数。

main.c

#include<stdio.h>int main()
{extern int num;printf("%d",num);return 0;
}

b.c

#include<stdio.h>int num = 10;void func()
{printf("fun in a.c");
}

例如,这里b.c中定义了一个变量num,如果main.c中想要引用这个变量,那么可以使用extern这个关键字,注意这里能成功引用的原因是,num这个关键字在b.c中是一个全局变量,也就是说只有当一个变量是一个全局变量时,extern变量才会起作用,向下面这样是不行的。

mian.c

#include<stdio.h>int main() {extern int num;printf("%d",num);return 0;
} 

b.c

#include<stdio.h>void func() {int num = 5;printf("fun in a.c"); 
} 

另外,extern关键字只需要指明类型和变量名就行了不能再重新赋值,初始化需要在原文件所在处进行,如果不进行初始化的话,全局变量会被编译器自动初始化为0。像这种写法是不行的。

extern int num=4;

但是在声明之后就可以使用变量名进行修改了,像这样:

#include<stdio.h>int main()
{extern int num;num=1;printf("%d",num);return 0;
}

如果不想这个变量被修改可以使用const关键字进行修饰,写法如下:

mian.c

#include<stdio.h>int main()
{extern const int num;printf("%d",num);return 0;
}

b.c

#include<stdio.h>const int num=10;
void func()
{printf("fun in a.c");
}

使用include将另一个文件全部包含进去可以引用另一个文件中的变量,但是这样做的结果就是,被包含的文件中的所有的变量和方法都可以被这个文件使用,这样就变得不安全,如果只是希望一个文件使用另一个文件中的某个变量还是使用extern关键字更好。

3、引用另一个文件中的函数

extern除了引用另一个文件中的变量外,还可以引用另一个文件中的函数,引用方法和引用变量相似。

mian.c

#include<stdio.h>int main()
{extern void func();func();return 0;
}

b.c

#include<stdio.h>const int num=10;
void func()
{printf("fun in a.c");
}

这里main函数中引用了b.c中的函数func。因为所有的函数都是全局的,所以对函数的extern用法和对全局变量的修饰基本相同,需要注意的就是,需要指明返回值的类型和参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Raphael实现html中绘图

2019独角兽企业重金招聘Python工程师标准>>> 首先&#xff1a;下载Raphael的javascript库&#xff1a;http://raphaeljs.com/。或者在html页面<head></head>&#xff1a;如下 <script src"http://www.zfanw.com/blog/raphael.js"></…

ITSS认证对企业的意义

在数字化时代&#xff0c;信息技术已经成为企业发展的重要驱动力。ITSS&#xff08;信息技术服务标准&#xff09;认证&#xff0c;作为信息技术服务领域的权威认证&#xff0c;对企业的意义非凡。本文将从提高服务质量、提升企业竞争力、优化管理体系、保障信息安全等方面&…

vivo手机刷机鸿蒙,捡到vivo手机如何刷机

捡到手机&#xff0c;首先建议归还给失主&#xff01;然后如果需要刷机的话&#xff0c;建议可以清除账户密码&#xff1a;可以尝试在手机关机状态同时按住音量上键以及电源键3到4秒手机出现vivo手机标志后&#xff0c;放开按键进入recovery模式&#xff0c;先选择wipe data/fa…

UEditor 百度富文本编辑器 .Net实例

转自 http://download.csdn.net/download/hdsslxl/6740605 1、UEditor 百度富文本编辑器完整版 .Net实例 已解决上传图片问题。 2、内附完整demo实例&#xff0c;附带txt讲解说明及UEditor常见问题解决方案。 3、已经调试好的百度文本编辑器实例&#xff0c;用户体验不错&#…

详解ROM和RAM

参考&#xff1a;详解ROM和RAM 作者&#xff1a;嵌入式实验楼 网址&#xff1a;https://mp.weixin.qq.com/s/FhUxMLeAxkhWe5m-gV_hMw 目录1、只读存储器&#xff1a;ROM2、随机访问存储器&#xff1a;RAM内存是计算系统最重要的元素&#xff0c;因为没有它&#xff0c;计算机就…

ubuntu解压和压缩文件

.tar 解包&#xff1a;tar xvf FileName.tar打包&#xff1a;tar cvf FileName.tar DirName&#xff08;注&#xff1a;tar是打包&#xff0c;不是压缩&#xff01;&#xff09;———————————————.gz解压1&#xff1a;gunzip FileName.gz解压2&#xff1a;gzip -d…

python递归查询并列出目录

第一种方法&#xff1a;>>> import os #导入模块 >>> os.walk(/tmp/test/testdir) #os的walk函数对象 <generator object walk at 0x1e8a960> >>> for i in os.walk(/tmp/test/testdir): #for循环打印出目录的文件 ... print i ... (/tmp…

html 输入框防止自动记忆,网页输入框input填写内容自动记忆功能怎么去除

我们在做前端的html网页模板的时候&#xff0c;免不了要制作一些输入框&#xff0c;供使用者输入信息实现人机交互。一般情况下我们都会使用如下的HTML代码来生成单行输入框&#xff1a;这是一个很简单的HTML代码&#xff0c;其效果就是可以在前端页面输出一个输入框供用户输入…

深入理解STM32内存管理

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…

django ORM中的RelatedManager(关联管理器)

关联管理器应用在 一对多的表 或者 多对多的表 多对多表中的用法: 在多对多的表中 正向查询 #基于对象的查询 #正查 # author_obj Author.objects.get(id1) # print(author_obj) #<Author object: 1 吴晓波> # print(author_obj.book_set.all()) #出版过的所有的书 …

html 手写字效果,canvas画布实现手写签名效果的示例代码

最近项目中涉及到移动端手写签名的功能需求&#xff0c;将实现代码记录于此&#xff0c;供小伙伴们参考指摘哦~HTML代码&#xff1a;手写区清除确定CSS样式&#xff1a;.mSign_signMark_box{padding: 15px 15px 26px 15px;}.mSign_signMark_footer{max-width:640px;margin:0 au…

ADO.NET 快速入门(十五):ADO 应用转换为 ADO.NET

这是一个已经移植到 .NET 的 ADO 应用的例子。也演示了单向、只读、快速 DataReader 的使用。它演示如何使用 DataView 类从 DataSet 获取一个 Table 和 操作一个类似于旧的 ADO 记录集模型。请记得&#xff0c;ADO 记录集仅仅包含一个 Table 的数据&#xff0c;但是 ADO.NET D…

FTP云盘

参考&#xff1a;FTP云盘项目 作者&#xff1a;糯米啊啊 发布时间&#xff1a; 2021-08-19 10:34:05 网址&#xff1a;https://blog.csdn.net/weixin_43732386?spm1001.2014.3001.5509 参考&#xff1a;自制FTP云盘项目 作者&#xff1a;不说话的小脑斧 发布时间&#xff1a; …

html transform属性,css3 transform属性详解

CSS3变形是一些效果的集合&#xff0c;比如平移translate() 、旋转rotate()、缩放scare()和倾斜skew()效果&#xff0c;每个效果都被称作为变形函数(Transform Function),它们可以操控元素发生旋转、缩放、和平移等变化。CSS3的2D transform函数包括了translate()、scale()、ro…

UIApplication的作用

1.设置app图标右上角的数字2.设置状态栏的属性&#xff08;样式、是否要显示&#xff09;3.打开某个链接\发短信\打电话4.keyWindow : 访问程序的主窗口&#xff08;一个程序只能有一个主窗口&#xff09;5.windows : 访问程序中的所有窗转载于:https://www.cnblogs.com/gatsby…

PHP调用新浪API 生成短链接

我们经常收到类似于这样的短信&#xff08;如下图&#xff09;&#xff0c;发现其中的链接并不是常规的网址链接&#xff0c;而是个短小精悍的短链接&#xff0c;产品中经常需要这样的需求&#xff0c;如果在给用户下发的短信中是一个很长的连接&#xff0c;用户体验肯定很差&a…

Chrome如何下载网页视频

目录第一步&#xff1a;右键&#xff0c;选择「检查」指令&#xff0c;进入代码控制面板第二步&#xff1a;单击代码面板左上角红色标出来的按钮&#xff0c;然后鼠标移到左边视频上第三步&#xff1a;双击src后面的代码&#xff08;全部展开&#xff09;&#xff0c;复制粘贴到…

使用MUTT步骤

使用MUTT&#xff0c;以下是步骤&#xff1a;1.1、首先确认一下MUTT是被已经安装 [oracledevdb02 ]$ rpm -aq | grep muttmutt-1.4.1-11.rhel41.2、检查系统是否安装中文字符集 [oracledevdb02 ]$ locale -a | grep zh_CNzh_CNzh_CN.gb18030zh_CN.gb2312zh_CN.gbkzh_CN.u…

html iso标准文档,HTML ISO-8859-1 参考手册

HTML ISO-8859-1 参考手册ISO(全称 International Standards Organization)为不同的字母/语言定义了标准的字符集。在 HTML 4.01 中&#xff0c;ISO-8859-1 是默认的字符。现代的浏览器支持的字符集&#xff1a;ISO-8859-1ISO-8859-1 是大多数浏览器默认的字符集。ISO-8859-1 的…

单链表反转

参考&#xff1a;【图文解析】反转一个单链表 作者&#xff1a;giturtle 发布时间&#xff1a; 2019-03-18 15:26:38 网址&#xff1a;https://blog.csdn.net/qq_42351880/article/details/88637387?spm1001.2014.3001.5501 目录例题描述思路代码实现例题描述 反转一个链表 …