野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10153|回复: 7

我见过最恶心的关键字extern,共享出来大家一起吐槽

[复制链接]
发表于 2017-11-15 14:36:36 | 显示全部楼层 |阅读模式
最近在写东西时候,编译会出现变量重复定义或者重复声明了,很烦人的一个错误,查问题时候发现自己变量的定义和声明区分不是很清楚,还有就是以为全局变量在头文件用关键字extern修饰就行了,越查就越觉得extern这个关键字十分恶心,在此共享出来大家一起学习。
https://www.cnblogs.com/tshua/p/5741009.html
http://bbs.csdn.net/topics/390267276
以上链接所写内容希望大家尊重原博客作者,错误或者不全勿喷。
回复

使用道具 举报

发表于 2017-11-15 14:45:08 | 显示全部楼层
本帖最后由 wqy_1000 于 2017-11-15 14:46 编辑

extern int a=0;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-15 14:52:06 | 显示全部楼层

这个在MDK环境里面会有告警
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-15 15:03:47 | 显示全部楼层
首先,明确一下“声明”和“定义”的概念。
“声明”,很简单,就是宣布“有这么个东西”。
“定义”,也很简单,就是宣布“有这么个东西,就放在这里”。

所以说,声明可以有多次,定义只能有一次。
一个东西只能放在一个地方,但你可以到处说我有这么个东西。

你在头文件里放了声明,于是包含这个头文件的源文件都知道了你有这么个变量。
但问题在于,这个变量没有真的放在任何一个地方,于是链接时源文件们就开始互相问了,“你那里有没有这个变量?”“没有啊,你那里呢?”“也没有啊。”……
但你不能在头文件里放定义,那样的话,就会变成“我这里有叫这个名字的变量!”“我这里也有叫这个名字的变量!”“我们要链接到一起,那到底该使用谁的这个名字的变量?”

所以,声明放在头文件里用来被各种源文件包含,定义放在某一个源文件里保证链接时只有一个。
不管是变量还是函数都一样。
以上为摘取部分文字,通俗易懂
http://bbs.csdn.net/topics/390267276
回复 支持 反对

使用道具 举报

发表于 2017-11-15 15:17:40 | 显示全部楼层
extern int a=0;
声明外部变量时是不能有赋值的,要不然是会报错的。另外声明的外部变量只能是全局的变量。
回复 支持 反对

使用道具 举报

发表于 2017-11-15 15:19:11 | 显示全部楼层
是不是你不会使用extern的原因造成的       ???????????
如果你定义的全局变量需要在很多的头文件里面使用,那么你可以在头文件里面定义这个全局变量,那么怎么做?
教大家一个如何在头文件中定义全局变量的方法
http://www.firebbs.cn/forum.php? ... tid=18641&fromuid=1
(出处: 野火论坛)

这种方法适合一个全部变量需要在非常多的文件里面使用,这个时候用你说的那种extern的方法来声明的话,就会出现重复定义的情况,这个时候需要特殊处理,具体的我写在帖子上面了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-15 16:25:44 | 显示全部楼层
fire 发表于 2017-11-15 15:19
是不是你不会使用extern的原因造成的       ???????????
如果你定义的全局变量需要在很多的头文件里面使用 ...

extern之前确实学的印象不深刻,现在恍然大悟
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-15 16:26:23 | 显示全部楼层
wqy_1000 发表于 2017-11-15 15:17
extern int a=0;
声明外部变量时是不能有赋值的,要不然是会报错的。另外声明的外部变量只能是全局的变量 ...

学习了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-17 02:58 , Processed in 0.039772 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表