c语言中extern关键字
extern
关键字适用于变量及函数,并且扩展了他们的可见性,这也就是它被命名为extern
的原因。
首先介绍一下声明(declaration)和定义(definition)的区别:
- 声明一个变量或者函数并没有给它们分配内存,它只是告诉程序它的类型是什么。在函数声明的情况下,它还告诉程序参数、它们的数据类型、这些参数的顺序以及函数的返回类型。
- 定义一个变量或者函数时,除了声明所做的一切之外,他还为该变量或函数分配内存。因此,我们可以把定义看作时声明的超集(或者声明是定义的子集)。
一个变量或者函数可以声明任意次数,但只能定义一次。
当我们在声明或定义函数时,会隐藏extern
关键字。例如,当我们定义如下函数时:
int foo(int arg1, char arg2);
编译器会将其视为
extern int foo(int arg1, char arg2);
由于extend
关键字将函数的可见性扩展到整个程序,因此可以在整个程序的任何文件中调用该函数,前提是这些文件包含该函数的声明。有了函数的声明,编译器就知道函数的定义存在于其他地方,然后继续编译文件。
当我们需要对一个变量声明而不定义的时候,我们会用extern
来修饰该变量。如下所示
extern int var;
这里声明了一个名为var
的整型变量(并没有定义,也就是说没有给var分配内存)。这个声明可以进行多次。但是当我们去掉extern
关键字后:
int var;
在这一行中,声明并定义了一个名为var
的整数类型变量,var被分配内存。
因此当我们声明一个函数时,extern
关键字是隐式的,当我们想声明而不定义变量时,我们需要显式的包含extern
关键字。此外,由于extern
关键字扩展了整个程序的可见性,通过对变量使用extern
关键字,我们可以在程序中任何地方使用该变量,前提是我们包含了该变量在某个地方的声明。
接下来用几个例子来理解extern
关键字:
Example 1:
int var;
int main(void) {var = 10;return 0;
}
这个程序是可以成功运行的,因为var
变量是全局变量,并且声明和定义的。
Example 2:
extern int var;
int main(void) {return 0;
}
这个程序也是可以成功运行的,因为这里虽然只是声明了var
变量,但是var
变量并没有实际使用过,所以不会出现问题。
Example 3:
extern int var;
int main(void) {var = 10;return 0;
}
这个程序就会出现问题,会在编译的时候抛出错误。因为var变量只进行了声明,并没有定义(也就是说没有分配内存),程序试图将不存在的变量的值更改为10。
Example 4:
#include "somefile.h"
extern int var;
int main(void) {var = 10;return 0;
}
假定somefile.h
包含var
的定义,这个程序是可以成功运行的。
Example 5:
extern int var = 0;
int main(void) {var = 10;return 0;
}
如果用extern声明了var变量,并且对该变量进行初始化,那么该变量被认为是已定义的。所以该程序可以顺利编译并运行。
总结
- 声明可以进行任意次,但是定义只能一次
- extern关键字用于扩展变量/函数的可见性
- extern修饰函数是隐式的,函数的声明或定义中默认使用extern修饰
- extern修饰变量时,该变量只被声明,而没有定义
- 当使用extern修饰变量同时进行初始化时,该变量同时也被定义
参考链接:Understanding “extern” keyword in C
c语言中extern关键字相关推荐
- C语言中extern关键字的使用
C语言中extern关键字的使用,直接上代码. file1.c文件 #include<stdio.h> extern long power(int); int A = 2; int mai ...
- c语言中extern关键字_了解C语言中的extern关键字
c语言中extern关键字 In this article, we'll take a look at understanding the extern keyword in C. 在本文中,我们将了 ...
- c语言关键字extern作用,C语言中extern关键字详解
<C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...
- C语言中extern关键字用法
一. 修饰变量,作为外部变量声明 一句话总结:扩充了全局变量的作用域,外部变量是在函数外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾.如果外部变量不再文件的开头定义,其有效作用 ...
- c语言typeof 变量,c语言中typeof关键字
为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛! 下面这两个等效声明,用于声明int类弄的变量a typeo ...
- 【✊基础不牢,地动山摇のC语言中static关键字✊】
C语言中static关键字 用static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分.要降对象指定为静态存储,可以在正常的声明之前加上关键字static作为前缀. ...
- C语言中static关键字详解
C语言中staic关键字很简单,简单到你的任何一个项目中可以不写一个staic关键字也是没有问题的.写这篇章主要是一下自己的staic的理解和应用,当然在章开头依旧要照本宣科简述一下static关键字 ...
- C语言中定义常量的关键字是什么,C++_详解C语言中const关键字的用法,关键字const用来定义常量,如 - phpStudy...
详解C语言中const关键字的用法 关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const ...
- c语言中extern变量,C语言中的Extern用法
C语言中的Extern用法 (2010-07-28 12:50:39) 标签: 杂谈 分类: 技术 C语言中的Extern用法 网上有很多帖子问C语言中Extern的用法,而且回答的详细程度各尽不同. ...
- C语言中typeof作用,浅析C语言中typeof关键字用法
浅析C语言中typeof关键字用法 前言 C语言中 typeof 关键字是用来定义变量数据类型的.在linux内核源代码中广泛使用. 下面是Linux内核源代码中一个关于typeof实例: #defi ...
最新文章
- redis的集群搭建
- hiveSql常见错误记录
- Redis-相关概念记录
- 脚本在流程中的性能影响
- MATLAB并行实现的简单方法
- 手把手教你如何安装Mac OS X 图文详细教程
- swift -- Tuple 元组 Dictionary
- 张志华:机器学习的发展历程及启示
- Linux中buff-cache占用过高解决方案
- 我今天学习的技术,明天会不会一钱不值
- 高校成绩管理数据库系统
- YYLabel使用笔记
- 近期币圈与美股的相关性
- sysfader iexplore应用程序错误
- 我对于微信文章的感悟
- php获取手机本地,PHP通过API获取手机号码归属地
- ne_comment 表
- golang的运维开发
- 怎么更改计算机 盘符名称,怎么更改盘符,windows修改盘符方法
- 1、乐趣国学——“君子不器”