一文彻底搞懂extern用法
一、定义和声明的区别
声明:用来告诉编译器变量的名称和类型,而不分配内存,不赋初值。
定义:为了给变量分配内存,可以为变量赋初值。
注:定义要为变量分配内存空间;而声明不需要为变量分配内存空间。
二、extern用法
2.1 extern 函数
为什么要用extern 函数呢?直接#include相应的头文件不可以嘛?
例子,如led.cpp 想调用delay.cpp中的delayms函数,有两种方法:
方法1:include 头文件,即直接 #delay.h
方法2: extern 方法 ,extern void delayms这句在调用文件中使用,表示引用全局函数delayms()。
优点:不inlcude delayms.h就不会引入大量头文件,进而不会引入大量的无关函数。这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。 在makefile中需要led.o和delay.o写在一起,否则link的时候找不到delayms而报错。
2.2 extern 变量
如果文件b.c需要引用a.c中变量int v,就可以在b.c中声明extern int v,然后就可以引用变量v。能够被其他模块以extern修饰符引用到的变量通常是全局变量。注意,extern int v可以放在a.c中的任何地方,具体作用范围和局部变量相同。
extern的原理很简单,就是告诉编译器:“你现在编译的文件中,有一个标识符虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量,你要放行!”
2.3 在C++文件中调用C方式编译的函数
比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。
注意:声明可以多次,定义只能一次。
extern int i; //声明,不是定义
int i; //声明,也是定义
三、通俗讲解
非常难以理解的是,在定义变量的时候,这个extern居然可以被省略(定义时,默认均省略);在声明变量的时候,这个extern必须添加在变量前,所以有时会让你搞不清楚到底是声明还是定义。
或者说,变量前有extern不一定就是声明(首先声明必须要有extern,但是定义如果不省略也可以有extern),而变量前无extern就只能是定义(声明必须要有extern,没有extern只能是定义省略extern的情况)!!!
一般来讲,定义默认省略extern,因此可以得到:有extern为声明,没有extern为定义。
小技巧:无论是否有extern修饰,赋初值==定义。如下两种方式是等价的,必为定义!!!
//如果在声明的时候给变量赋值,那么就去掉extern直接定义变量赋值是等价的
extern int a = 10;//尽量不要写这种定义方式
int a = 10;//上述两条语句等价
一文彻底搞懂extern用法相关推荐
- 一文彻底搞懂volatile用法
一.常见说法 volatile 关键字和const对应,一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统.硬件或者其它线程等.遇到这个关键字声明的变量,编译器对访问 ...
- layer output 激活函数_一文彻底搞懂BP算法:原理推导+数据演示+项目实战(下篇)...
在"一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)"中我们详细介绍了BP算法的原理和推导过程,并且用实际的数据进行了计算演练.在下篇中,我们将自己实现BP算法(不使用第 ...
- 一文彻底搞懂前端监控 等推荐
大家好,我是若川.话不多说,这一次花了几个小时精心为大家挑选了20余篇好文,供大家阅读学习.本文阅读技巧,先粗看标题,感兴趣可以都关注一波,一起共同进步. 前端点线面 前端点线面 百度前端研发工程师, ...
- opc服务器是硬件吗,opc是什么(一文彻底搞懂什么是OPC)
原标题:(opc是什么(一文彻底搞懂什么是OPC)) opc是什么(一文完全搞懂什么是OPC)从2000年终以来,我们就一直在运用OPC软件互操纵性范例,而那些正准备踏入和想要踏入工业自动化范畴的人们 ...
- 一文彻底搞懂BP算法:原理推导+数据演示+项目实战(下篇)
在"一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)"中我们详细介绍了BP算法的原理和推导过程,并且用实际的数据进行了计算演练.在下篇中,我们将自己实现BP算法(不使用第 ...
- 一文彻底搞懂Mybatis系列(十六)之MyBatis集成EhCache
MyBatis集成EhCache 一.MyBatis集成EhCache 1.引入mybatis整合ehcache的依赖 2.类根路径下新建ehcache.xml,并配置 3.POJO类 Clazz 4 ...
- 一文彻底搞懂ROC曲线与AUC的概念
一文彻底搞懂ROC曲线与AUC的概念 1. ROC曲线的初级含义 1.1 精确率和召回率 1.2 ROC曲线的含义 2. ROC曲线如何绘制 3. ROC曲线和排序有什么关联? 4. AUC和基尼系数 ...
- 一文快速搞懂Kudu到底是什么
文章目录 引言 文章传送门: Kudu 介绍 背景介绍 新的硬件设备 Kudu 是什么 Kudu 应用场景 Kudu 架构 数据模型 分区策略 列式存储 整体架构 Kudu Client 交互 Kud ...
- 一文快速搞懂对95%置信区间的理解
一文快速搞懂对95%置信区间的理解 综合知乎上各大神的解答和网络资料得到本文对95%置信区间的理解 先给出结论 最常出现的对置信区间的错误理解: 在95%置信区间内,有95%的概率包括真实参数 (错 ...
最新文章
- websecurity - Web Security Testing Framework 超级牛B扫描器
- Java BigDecimal plus()方法与示例
- dockerfile arg_解读三组容易混淆的 Dockerfile 指令
- 从阿里腾讯的大会上得到的启示,来分享一些可视化大屏
- java ArrayList集合
- winscp怎么更改linux权限,Linux下,WinSCP普通用户登录sftp后切换到root权限 教程
- python re包_使用Python中的re包将句子分成子句
- 最新人生感悟语句摘选
- 电力电子仿真软件---PLECS
- 如何根据台词找到对应电影片段
- java生成eml_用Java创建一个.eml(email)文件
- 2018天津大学夏令营机试第二题
- [译] Python 自动处理 Excel 报表
- pdf文件怎么缩小兆数
- python—计算矩阵标准差
- VCC AVCC VDD AVDD区别(转载)
- Django项目中浏览器显示127.0.0.1拒绝我们的连接请求
- CGB2109-Day10-mybatis
- 阿里云服务器安装oracle11g-整理实战各路大神汇总
- Excel累加上一行的数值