C语言如何声明外部变量?

一、问题

        由于C语⾔允许将⼀个较⼤的程序分成若⼲独⽴模块⽂件分别编译,如果⼀个源⽂件中的函数想引⽤其他源⽂件中的变量,那么就要想到如何声明外部变量。

二、解答

        外部变量可以⽤ extern 来声明。这就是说,extern 变量可以扩展外部变量的作⽤域。

1、在多⽂件的程序中声明外部变量

        定义时缺省 static 关键字的外部变量,就是⾮静态外部变量。其他源⽂件中的函数引⽤⾮静态外部变量时,需要在引⽤函数所在的源⽂件中进⾏声明。其语法格式如下。

extern 数据类型 外部变量表;

注意:

        在函数内的 extern 变量声明,表⽰引⽤本源⽂件中的外部变量,⽽函数外(通常在⽂件开头)的 extern 变量声明,表示引⽤其他⽂件中的外部变量。

例如,有⼀个源程序由源⽂件 filel.C 和 file2.C 组成。

filel.C

int x,y;    /*外部变量定义*/
char z;    /*外部变量定义*/
int main()
{...
}

file2.C

extern int x,y;    /*外部变量声明*/
extern char z;    /*外部变量声明*/ 
func (int a,b)
{...
}

        在filel.C 和 file2.C 两个⽂件中都要使⽤ x、y、z  3个变量。在 filel.C ⽂件中,把 x、y、z 都定义为外部变量;

        在 file2.C ⽂件中,⽤ extem 把 3 个变量声明为外部变量,表示这些变量已在其他⽂件中定义,并且这些变量的类型和变量名,编译系统将不再为它们分配内存空间。

        对构造类型的外部变量(如数组等),可以在声明时进⾏初始化赋值;若不赋初值,则系统⾃动定义其初值为 0 。

2、在⼀个⽂件内声明外部变量

        如果外部变量不在⽂件的开头定义,其有效的作⽤范围只限于定义处到⽂件结束处。 此时如果想在定义该变量的位置之前调⽤此变量,则应该在调⽤之前⽤关键字 extern 对该变量进⾏“外部变量声明”。

        在下⾯的示例程序中,将⽤ extern 声明外部变量,并将声明的外部变量值输出。代码如下。

#include <stdio.h>
int main()
{extern int X, Y;printf("The is an example!\n");printf("The extern variable is %d,%d\n", X, Y);
}
int X = 96, Y = 88;

程序运⾏结果如下:

The is an example!
The extern variable is 96,88

三、总结

        定义外部变量时,要注意控制的就是它的使⽤范围,这⼀点很重要。

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

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

相关文章

C语言之自定义类型联合和枚举

目录 前言 一&#xff1a;联合体&#xff08;共用体&#xff09;union 1.联合体类型的声明 2.联合体的特点 3.联合体大小的计算 4.联合体判断机器的大小端 二&#xff1a;枚举enum 1.概念 2.枚举的优点 3.枚举的使用 接下来的日子会顺顺利利&#xff0c;万事胜意…

Android Binder——Java服务注册(九)

对于 Java 端使用 Binder 服务,主要就是注册服务和获取服务,入口都是通过 ServiceManager.java 中的对应方法实现。这里我们就先介绍一下 Java 注册 Binder 服务的流程。 一、ServiceManager代理 无论是 ServiceManager.addService() 还是 ServiceManager.getService() 最终…

第9章 安全漏洞、威胁和对策(9.17)

9.17 移动设备(mobile device) 移动设备是指电池驱动的任何东西,通常不需要电源线就可以运行的任何东西。 备考时要把智能手机与移动设备、笔记本电脑、平板电脑乃至智能手表或计步器也考虑进来。 一些移动设备连典型的默认安全设置都做不到&#xff0c;更别提可供使用的安全…

C++ 类和对象(中篇)

类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情 况下&#xff0c;都会自动生成下面6个默认成员函数。 构造函数&#xff1a; 定义&#xff1a;构造函数是一个特殊的成员…

js的some函数

在JavaScript中&#xff0c;some() 是一个数组的方法&#xff0c;用于测试数组中是否至少有一个元素满足提供的函数。如果数组中有至少一个元素通过由提供的函数实现的测试&#xff0c;则它返回 true&#xff1b;否则返回 false。 以下是 some() 函数的基本语法&#xff1a; j…

【C语言】猜数字小游戏(并讲解随机数相关知识)

前言 一、游戏菜单 二、游戏逻辑 1.用户选择 2.开始游戏 2.1 生成1~100的随机数 总结 前言 本文讲解使用C语言写一个猜数字小游戏(1~100)&#xff0c;涉及到的语法为&#xff1a;循环、分支、随机数、函数 一、游戏菜单 一个游戏的最开始&#xff0c;往往是一个菜单&…

面试反问环节

目录 hr面反问技术面反问 一般反问3、4个问题 hr面反问 部门的工作氛围和领导风格是怎样的&#xff08;还有上下班作息时间等&#xff09;&#xff1f;部门对这个职位的期望是什么&#xff1f;部门的转正率大概有多少&#xff1f;实习生的薪资有多少&#xff1f;有房补吗&…

金融数据_Scikit-Learn决策树(DecisionTreeClassifier)实例

金融数据_Scikit-Learn决策树(DecisionTreeClassifier)实例 逻辑回归: 逻辑回归常被用于二分类问题, 比如涨跌预测。你可以将涨跌标记为类别, 然后使用逻辑回归进行训练。 决策树和随机森林: 决策树和随机森林是用于分类问题的强大模型。它们能够处理非线性关系, 并且对于特征…

Jetpack Bluetooth——更优雅地使用蓝牙

Jetpack Bluetooth——更优雅地使用蓝牙 蓝牙是安卓开发中非常常用的操作&#xff0c;但安卓经过这么多年的迭代&#xff0c;蓝牙的相关接口都经过了很多修改需要适配&#xff0c;还有的接口需要实现一堆函数。。。整套操作虽说不算复杂&#xff0c;但难免感觉不太舒服。 之前…

专题【双指针】【学习题】刷题日记

题目列表 11. 盛最多水的容器 42. 接雨水 15. 三数之和 16. 最接近的三数之和 18. 四数之和 26. 删除有序数组中的重复项 27. 移除元素 75. 颜色分类 167. 两数之和 II - 输入有序数组 2024.04.06 11. 盛最多水的容器 题目 给定一个长度为 n 的整数数组 height 。有 n 条垂…

阿里云服务器 篇二:搭建静态网站

文章目录 系列文章获取静态网站模板应用静态网站模板解压zip文件SCP命令上传文件其他上传文件的方法 系列文章 阿里云服务器 篇一&#xff1a;申请和初始化 阿里云服务器 篇二&#xff1a;搭建静态网站 获取静态网站模板 站长素材&#xff1a;网站中包括大量的免费模板&…

上传视频的核心代码

/*** 上传学习视频信息*/Log(title "上传学习视频信息", businessType BusinessType.INSERT)PostMapping("/uploadVideo")public AjaxResult add(HttpServletRequest request) {return toAjax(videoInfoService.insertVideoInfo(request));}/*** 上传学习…

PHP实现网站微信扫码关注公众号后自动注册登陆实现方法及代码【关注收藏】

在网站注册登陆这环节&#xff0c;增加微信扫码注册登陆&#xff0c;普通的方法需要开通微信开发者平台&#xff0c;生成二维码扫码后才能获取用户的uinonid或openid&#xff0c;实现注册登陆&#xff0c;但这样比较麻烦还要企业认证交费开发者平台&#xff0c;而且没有和公众号…

如何控制Docker容器退出后的自动重启行为?

在Docker中&#xff0c;可以通过以下两种方式来控制容器退出后的自动重启行为&#xff1a; 使用docker run命令时&#xff0c;通过设置--restart参数来指定容器退出后的重启策略。可以使用以下值之一&#xff1a; no: 默认值&#xff0c;容器退出后不会自动重启。always: 容器…

什么是EL表达式?怎么使用?

文章目录 一、什么是EL表达式1、命令格式&#xff1a;${作用域对象别名.共享数据} 二、EL表达式与作用域对象别名1、JSP文件可以使用的作用域对象2、EL表达式提供作用域对象别名3、EL表达式将引用对象属性写入到响应体4、EL表达式简化版 三、EL表达式与运算表达式四、EL表达式提…

【SQL】1890. 2020年最后一次登录(简单写法;窗口函数写法)

前述 sql 中 between 的边界问题 ---- between 边界&#xff1a;闭区间&#xff0c;not between 边界&#xff1a;开区间 在 sql 中&#xff0c; between 边界&#xff1a;闭区间not between 边界&#xff1a;开区间 题目描述 leetcode题目&#xff1a;1890. 2020年最后一…

【leetcode面试经典150题】16.接雨水(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

aardio教程五) 写Python风格的aardio代码(字符串篇)

前言 熟悉一个新的语言最麻烦的就是需要了解一些库的使用&#xff0c;特别是基础库的使用。 所以我想给aardio封装一个Python风格的库&#xff0c;Python里的基础库是什么方法名&#xff0c;aardio里也封装同样的方法名。 这样就不需要单独去了解aardio里一些方法的使用细节…

Lanelets_ 高效的自动驾驶地图表达方式

Lanelets: 高效的自动驾驶地图表达方式 附赠自动驾驶学习资料和量产经验&#xff1a;链接 LaneLets是自动驾驶领域高精度地图的一种高效表达方式&#xff0c;它以彼此相互连接的LaneLets来描述自动驾驶可行驶区域&#xff0c;不仅可以表达车道几何&#xff0c;也可以完整表述车…

.NET9 PreView2+.AOT ILC 的重大变化

RyuJIT 增强功能 1. 环路优化 (循环优化) 这种优化实际上是一种 for 循环叠加态的优化&#xff0c;for 循环叠加计算的过程中&#xff0c;会对其中部分变量进行感应。比如循环中放置 0 扩展 (第一个索引为 0)&#xff0c;这种优化灵感来源于 LLVM 标量演化。下面看例子&#…