一、定义和声明的区别

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

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

注:定义要为变量分配内存空间;而声明不需要为变量分配内存空间。


二、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用法相关推荐

  1. 一文彻底搞懂volatile用法

    一.常见说法 volatile 关键字和const对应,一样是一种类型修饰符,用它修饰的变量表示可以被某些编译器未知的因素更改,比如操作系统.硬件或者其它线程等.遇到这个关键字声明的变量,编译器对访问 ...

  2. layer output 激活函数_一文彻底搞懂BP算法:原理推导+数据演示+项目实战(下篇)...

    在"一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)"中我们详细介绍了BP算法的原理和推导过程,并且用实际的数据进行了计算演练.在下篇中,我们将自己实现BP算法(不使用第 ...

  3. 一文彻底搞懂前端监控 等推荐

    大家好,我是若川.话不多说,这一次花了几个小时精心为大家挑选了20余篇好文,供大家阅读学习.本文阅读技巧,先粗看标题,感兴趣可以都关注一波,一起共同进步. 前端点线面 前端点线面 百度前端研发工程师, ...

  4. opc服务器是硬件吗,opc是什么(一文彻底搞懂什么是OPC)

    原标题:(opc是什么(一文彻底搞懂什么是OPC)) opc是什么(一文完全搞懂什么是OPC)从2000年终以来,我们就一直在运用OPC软件互操纵性范例,而那些正准备踏入和想要踏入工业自动化范畴的人们 ...

  5. 一文彻底搞懂BP算法:原理推导+数据演示+项目实战(下篇)

    在"一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)"中我们详细介绍了BP算法的原理和推导过程,并且用实际的数据进行了计算演练.在下篇中,我们将自己实现BP算法(不使用第 ...

  6. 一文彻底搞懂Mybatis系列(十六)之MyBatis集成EhCache

    MyBatis集成EhCache 一.MyBatis集成EhCache 1.引入mybatis整合ehcache的依赖 2.类根路径下新建ehcache.xml,并配置 3.POJO类 Clazz 4 ...

  7. 一文彻底搞懂ROC曲线与AUC的概念

    一文彻底搞懂ROC曲线与AUC的概念 1. ROC曲线的初级含义 1.1 精确率和召回率 1.2 ROC曲线的含义 2. ROC曲线如何绘制 3. ROC曲线和排序有什么关联? 4. AUC和基尼系数 ...

  8. 一文快速搞懂Kudu到底是什么

    文章目录 引言 文章传送门: Kudu 介绍 背景介绍 新的硬件设备 Kudu 是什么 Kudu 应用场景 Kudu 架构 数据模型 分区策略 列式存储 整体架构 Kudu Client 交互 Kud ...

  9. 一文快速搞懂对95%置信区间的理解

    一文快速搞懂对95%置信区间的理解 综合知乎上各大神的解答和网络资料得到本文对95%置信区间的理解 先给出结论 最常出现的对置信区间的错误理解: 在95%置信区间内,有95%的概率包括真实参数  (错 ...

最新文章

  1. websecurity - Web Security Testing Framework 超级牛B扫描器
  2. Java BigDecimal plus()方法与示例
  3. dockerfile arg_解读三组容易混淆的 Dockerfile 指令
  4. 从阿里腾讯的大会上得到的启示,来分享一些可视化大屏
  5. java ArrayList集合
  6. winscp怎么更改linux权限,Linux下,WinSCP普通用户登录sftp后切换到root权限 教程
  7. python re包_使用Python中的re包将句子分成子句
  8. 最新人生感悟语句摘选
  9. 电力电子仿真软件---PLECS
  10. 如何根据台词找到对应电影片段
  11. java生成eml_用Java创建一个.eml(email)文件
  12. 2018天津大学夏令营机试第二题
  13. [译] Python 自动处理 Excel 报表
  14. pdf文件怎么缩小兆数
  15. python—计算矩阵标准差
  16. VCC AVCC VDD AVDD区别(转载)
  17. Django项目中浏览器显示127.0.0.1拒绝我们的连接请求
  18. CGB2109-Day10-mybatis
  19. 阿里云服务器安装oracle11g-整理实战各路大神汇总
  20. Excel累加上一行的数值

热门文章

  1. Maxscale实现MySQL读写分离
  2. FPGA和USB3.0通信
  3. 基于RK3288安卓Android5.1平台移植RTL8152驱动
  4. 加入购物车与购物车加减
  5. dp和px的区别,dp与px换算关系
  6. linux内核hook技术之指令覆盖与注入
  7. init: cannot execve(‘XXX’):Permission denied问题
  8. 模拟CMOS集成电路设计入门学习(4)
  9. uniapp点击按钮 保存页面为图片到本地
  10. Lesson3:函数