1.了解extern

1.extern是C语言的一个关键字,可以用来修饰函数与变量

2.当extern修饰一个变量或函数时时,就是在声明这个变量(函数),告诉编译器在外部文件中已经这个变量(函数),要通过编译。

2.extern的用法

1.在一个文件中引用其他文件的变量

当我们一个项目中有多个.cpp文件时,往往需要在其中一个文件中使用另一个文件中定义的变量,如果我们直接使用,编译器就会报错:

由于编译文件1的时候编译器不认识g_val,以此编译失败

这时我们就可以使用extern,如下:

//文件1.cpp代码#include<stdio.h>
extern int g_val;    //声明外部符号g_val
int main()
{printf("%d", g_val);
}//文件2.cpp代码
int g_val = 10;

这时,代码就可以成功运行起来,打印出g_val的值。

2.在一个文件中引用其他文件的函数

对于函数,也是同理,当需要使用外部文件定义的函数时,需要使用extern关键字进行声明:

//文件1.cpp代码
#include<stdio.h>
extern void show();    //声明外部符号show()
int main()
{show();
}//文件2.cpp代码
#include<stdio.h>
void show()
{printf("hello world");
}

运行结果如下:

hello world

3.extern的注意事项

在使用extern时我们可能会写出这样的代码 :

//文件1.cpp代码#include<stdio.h>
extern int g_val=10;
int main()
{printf("%d", g_val);
}//文件2.cpp代码
int g_val = 10;

上述代码是在引用外部变量g_val的时候同时对它进行赋值,当我们运行时,编译器就会报错,这个错误是在链接的时候发生的错误,为“找到一个或多个多重定义的符号” 。


产生错误的原因时什么呢 ?这就不得聊到定义与声明了。

1.什么定义:

定义是给变量或函数分配内存空间,在这同时可以为变量赋初值。

2.什么是声明:

声明是用来告诉编译器变量的名称和类型,使编译器知道存在着这个变量和类型,且不分配内存。

3.结论

由此我们可以得出以下两种结论:

1.定义会对变量分配内存空间,而声明不会

2.由于一个变量的存储空间是唯一的,因此定义不能重复定义,而声明可以重复声明。


由此可以得出,当我们使用extern修饰变量且对它进行赋值的时候,这条语句就不是在对变量进行声明了,而是定义,因为声明一个变量编译器是不会分配内存空间的,而对于一个不存在的内存空间进行赋值操作,显然是不合理的。

而当我们进行定义的时候,编译器在编译的时候并不会发现错误,但在多文件进行链接时,就会发现g_val这个全局变量同时在1.cpp和2.cpp进行定义,报出了重定义的错误。

4.extern与include

1. include

当我们有多个文件需要大量引用外部变量或函数的时候,如果使用extern,我们就需要在多个文件中大量使用extern,这样做效率显然会降低,代码也显得太过LOW。因此,我们通常将所有的全局变量和常用全局函数都写在一个.cpp文件中,然后用同名的.h文件放这些变量与函数的声明(即头文件),这样其他文件需要使用外部变量和函数时,就只需要包含其中的头文件即可,显得高效又简洁。如:

//文件1cpp代码
#include "2.h"
int main()
{show();printf("%d", g_val);
}//文件2.cpp代码,用于定义与实现
#include "2.h"
int g_val = 10;
void show()
{printf("hello world");
}//文件2.h代码,用于声明
#pragma once           //防止重复包含
#include<stdio.h>
extern int g_val;
void show();

这样,当我们需要使用2.cpp中的变量和函数时,就不需要再使用extern声明了

2.extern的好处

想必会有读者有疑问,include那么方便,那我们的extern关键字是不是没有用了?实则不然。原因如下:

1.当头文件中有大量的变量与函数时,如果我们只需要其中的少量变量或函数时,我们使用include包含,显然会引入大量不需要的无关函数与无关变量,这样无疑会减慢程序预处理的过程,此时使用extern就可以有效缩短时间。

2.在大工程中,一个头文件中经常会包含其他的头文件,这样层层嵌套下来,如果没有进行处理,往往会出现一个.c文件重复包含相同头文件的情况,而使用extern就不会出现这种情况。(当然,如果头文件进行适当的处理如“条件编译”,也能有效地避免重复包含的现象,这里先暂时不做详细讨论)


制作不易,能否点个赞再走呢qwq

C语言学习之extern关键字相关推荐

  1. c语言学习(常见关键字)

    c语言提供的关键字 特点 1,c语言提供的,不能自己创建关键字 2,变量名不能是关键字,下面这种就是错误的写法 int char; 常见的关键字 auto        break        ca ...

  2. C语言extern关键字(去使用外部全局变量、函数)

    参考:C语言正确使用extern关键字 作者:xingjiarong 发布时间:2015-08-14 08:37:33 网址:https://blog.csdn.net/xingjiarong/art ...

  3. C语言extern关键字

    C语言正确使用extern关键字 利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数 extern关键字,C语言extern关键字用法详解

  4. C语言学习及应用笔记之六:C语言extern关键字及其使用

    在C语言中,修饰符extern用在变量或者函数的声明前,用来以标识变量或者函数的定义在别的文件中,提示编译器遇到此变量或者函数时,在其它文件中寻找其定义.extern关键字的用法有几种,我们下面对其进 ...

  5. 【C语言】20-static和extern关键字2-对变量的作用

    说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 上一讲介绍了static和ex ...

  6. C语言再学习 -- 存储类型关键字

    定义: 是对声明的实现或者实例化.连接器(linker)需要它(定义)来引用内存实体.与上面的声明相应的定义如下:参看:C语言再学习 -- 存储类.链接 C语言中有 5 个作为存储类说明符的关键字,分 ...

  7. c 函数多次声明_【C语言】- static和extern关键字 - 对函数的作用!

    不同类型的变量有不同的存储类型.不同的生命周期.不同的作用域.这篇小文介绍2个比较重要的关键字:static和extern. static和extern不仅可以用在变量上,还可以用在函数上.这讲先介绍 ...

  8. c语言extern_【零基础C语言】- static和extern关键字 - 对变量的作用!

    上一篇文章介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量 ...

  9. c语言extern关键字详解

    在c语言中代码的执行顺序是从上往下执行的,如果定义的函数或者变量在调用之后,那么调用的时候编译就会找不到需要使用的变量.这样就会出现错误,如下代码: #include<stdio.h>in ...

最新文章

  1. 环保—北京周边 自行车骑行线路大全
  2. ad13批量安装元件库_ad16如何批量添加封装库?
  3. 安检X光机下的春运归家图 宛如一幅幅水彩画
  4. DIY逗比的时钟,制作资料100%开源!
  5. oracle中to_date函数详解
  6. TCP/IP协议的三次握手及实现原理
  7. css hack 记录
  8. matlab 7 安装序列号,Matlab7序列号
  9. 用计算机和电视机组成家庭影院,请问家庭影院的音响能接在电脑上用么?我的电脑没有配置音响能用家庭 爱问知识人...
  10. 电脑维修知识:电脑常见故障维修大全及解决方法
  11. Xshell官网免费版下载实用
  12. 机房收费系统之实现图(组件图、部署图)
  13. 微信小程序用自己的服务器视频打开很慢,微信小程序视频播放加载很慢
  14. MSXML应用总结 开发篇(上)
  15. goole搜索技巧(摘要)
  16. speedoffice表格如何对内容进行分组?
  17. ftp.proxy 代理服务器搭建
  18. 程序员如何一句话教老板做事?“我先下班了,你可要加把劲啊”
  19. ng2 绑定输出html,Angular2的数据绑定
  20. C语言实现wav文件的读写

热门文章

  1. 手写jQuery轮播图(无缝回到第一张)
  2. HI3559AV100串口中断不够的解决方案---共享中断
  3. 利用cookie进行登录
  4. DAFormer代码学习
  5. android wear5.1.1更新,Android Wear 5.1体验:苹果表遭遇劲敌
  6. Cortana离开Windows 10的搜索栏,但必应保留
  7. Word取消首字母自动大写
  8. “中国原创力量”联盟成立,巨杉与联盟共同驱动中国创新
  9. 《投资最重要的事》(霍华德.马克斯)--读书会分享
  10. GIT删除分支命令以及GIT最常用命令总结