当前位置: 首页 > news >正文

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

三、总结

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

相关文章:

  • 一条SQL查询语句的执行顺序
  • mysql慢sql排查与分析
  • Blender怎么样启动默认移动和Cavity效果
  • 理解 Golang 变量在内存分配中的规则
  • ics-05-攻防世界
  • 爬取高校专业信息的Python爬虫简介与实践
  • 【C++ STL算法】sort 排序
  • 隐私计算实训营学习七:隐语SCQL的架构详细拆解
  • 数据库的基本操作
  • 面试题多态结合线程
  • 【TI毫米波雷达】IWR6843AOP的官方文件资源名称BUG,选择xwr68xx还是xwr64xx,及需要注意的问题
  • 【测试面试题】14题常见APP测试面试题(参考答案)
  • 加州大学欧文分校英语基础语法专项课程02:Questions, Present Progressive and Future Tenses 学习笔记
  • Inotify
  • Linux网络编程二(TCP图解三次握手及四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)
  • 网络传输文件的问题
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • css系列之关于字体的事
  • Idea+maven+scala构建包并在spark on yarn 运行
  • IP路由与转发
  • JSONP原理
  • mongodb--安装和初步使用教程
  • mongo索引构建
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python_OOP
  • RxJS: 简单入门
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue2 SSR 的优化之旅
  • webpack入门学习手记(二)
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于Vue2全家桶的移动端AppDEMO实现
  • linux 淘宝开源监控工具tsar
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #NOIP 2014# day.2 T2 寻找道路
  • #NOIP 2014#Day.2 T3 解方程
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Python) SOAP Web Service (HTTP POST)
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)springcloud实战之config配置中心
  • (过滤器)Filter和(监听器)listener
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十)c52学习之旅-定时器实验
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)visual stdio 书签功能介绍
  • (轉貼) UML中文FAQ (OO) (UML)
  • . NET自动找可写目录
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)