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

extern关键字

extern关键字的用法很简单,就是简简单单的声明,它可以明确的指出一个语句是声明;
比如extern int i;那么就说明 这是声明变量 i,而不是定义i,声明是不开辟内存的,定义是开辟内存的。
假如int i;没有extern修饰,那就说明为定义,会分配内存空间的。

extern 的使用场景1
extern 可以声明一个变量,使得该变量是来自其他文件的变量在本文件可以被访问。

比如:创建两个文件 test.c 和 main.c文件;
在test.c文件中定义一个全局变量:在main.c文件,声明变量 i;

//test.c
int i = 20; //定义一个全局变量
main.c文件
# include<stdio.h>
extern int i; //声明变量i,当编译链接时候,main.c文件就可以访问到test.c文件的i的值了;
int main()
{printf("%d",i);return 0;
}

这样我们就可以跨文件(test.c),在本文件(main.c)访问这个变量了;

extern 的使用场景2

# include<stdio.h>
# include"test.h"
//extern int i; 不用写了
//extern int j;不用写了
//extern int k;不用写了
//...
//声明很多很多变量,都不用写了,因为包含了头文件,声明都在头文件中
int main()
{printf("%d %d %d",i,j,k);return 0;
}


但是上诉的使用方式并不好,假如我一个大工程,这个工程由超级多的文件,这些文件假如都要访问
test.c文件的 变量 i,那么,只能在这些文件中,每个文件的开头都 声明变量 i,并且,假如我的test.c,不止一个定义一个变量i,有好多其他变量呢?在其他文件访问时候,都要声明好多变量,这会使得书写难度很繁琐,并且维护成本也大;

所以一般,我们都把声明语句放到头文件使用,即我定义一个test.h的头文件;
在该头文件中,声明 extern int i;
然后,假如你在其他文件要使用改变量i,直接包含该头文件即可,
比如:test.h 头文件

//test.h 头文件
extern int i;
extern int j;
extern int k;
//...
//声明很多很多变量

在其他.c文件,只要包含该头文件,就可以啦,比如在main.c文件:

extern的用法总结

extern一般用于声明,在.h文件中,声明变量或者函数(函数可以不加extern,但是最好加上,这样比较统一);在其他文件要访问该变量函数时候,包含头文件就行哦。

声明和定义的区别

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

extern int var; // 声明extern int ble =10; // 定义typedef int INT; // 声明struct Node; // 声明

即使是 extern ,如果给变量赋值了,就是定义了。

上面代码中,语句 extern int var;表示 var 在别的文件中已经定义,提示编译器遇到此变量时在其它模块中寻找其定义。语句 extern int ble = 10;表示定义了变量 ble,这一点需要注意。

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

通常变量的定义和声明是同时发生的,注意:extern 变量类型 变量名 仅是声明。

函数声明

函数的声明是通知编译器函数名称、参数数量和类型以及函数返回类型,例如:

int Max(int x, int y);
函数定义

函数的定义是为函数分配内存,例如:

int Max(int x, int y) {return x > y ? x : y;}

函数只要有实现(存在函数体 { …… } )即为定义,否则为声明。可以这样理解:函数声明是说明函数是什么,函数定义是说明函数做什么。

声明/定义次数

变量/函数可以声明多次,变量/函数的定义只能一次。

分配内存

声明不会分配内存,定义会分配内存。

做了什么

声明是告诉编译器变量或函数的类型和名称等,定义是告诉编译器变量的值,函数具体干什么。

http://www.dtcms.com/a/418642.html

相关文章:

  • 捷为科技亮相新能源汽车产业对接会,数智化平台赋能汽车行业高质量发展
  • ChatBI 学习
  • 百度网站推广咨询建筑网人才
  • 桂林网站建设服务网站定制牛七科技
  • WebRTC 发送端 SSRC 生成流程总结
  • 客户标签自动管理:标签自动化运营,画像持久保鲜
  • 云原生架构与GitOps技术栈介绍
  • 智能外呼产品架构组成
  • 【深度学习新浪潮】如何提升agent的专业性?
  • AI排名查询工具如何助力GEO优化?生成引擎优化中的关键词竞争力分析
  • 福州有网站建设的公司网站都需要什么类别
  • Nginx 反向代理与负载均衡核心内容总结
  • JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
  • 算法练习题
  • 9.数组介绍和静态初始化
  • 无重复字符的最长子串_优选算法(C++)滑动窗口
  • 提升雾化片性能,关键是精密测量盲孔尺寸
  • Flannel工作原理-Flannel故障案例-镜像拉取策略-secret对接harbor及ServiceAccount实战
  • GitLab高危漏洞可致实例崩溃(CVE-2025-10858 和 CVE-2025-8014)
  • 中铁建设投资集团有限公司网站自己公司怎样做免费的网站
  • 安卓13_ROM修改定制化-----修改rom 实现支持原生安装器 破除厂商定制限制
  • android 字符串工具类(兼容 Android 16+ / API 16,无报错版)
  • 9.28 深度学习10
  • 数据安全合规行业实战解析:金融、医疗与智能网联汽车的破局之道
  • 汽车全景天窗生产线解决方案 - SNK施努卡
  • 汽车地带AutoZone EDI需求分析及对接指南
  • 如何给自己网站做反链家在深圳罗湖
  • 云手机在电商行业中的优势都有哪些
  • 微信小程序入门学习教程,从入门到精通,微信小程序页面制作(2)
  • 漳州本地网站宝安网站开发