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关键字相关推荐

  1. C语言中extern关键字的使用

    C语言中extern关键字的使用,直接上代码. file1.c文件 #include<stdio.h> extern long power(int); int A = 2; int mai ...

  2. c语言中extern关键字_了解C语言中的extern关键字

    c语言中extern关键字 In this article, we'll take a look at understanding the extern keyword in C. 在本文中,我们将了 ...

  3. c语言关键字extern作用,C语言中extern关键字详解

    <C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...

  4. C语言中extern关键字用法

    一. 修饰变量,作为外部变量声明 一句话总结:扩充了全局变量的作用域,外部变量是在函数外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾.如果外部变量不再文件的开头定义,其有效作用 ...

  5. c语言typeof 变量,c语言中typeof关键字

    为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛! 下面这两个等效声明,用于声明int类弄的变量a typeo ...

  6. 【✊基础不牢,地动山摇のC语言中static关键字✊】

    C语言中static关键字 用static声明限定外部变量与函数,可以将其后声明的对象的作用域限定为被编译源文件的剩余部分.要降对象指定为静态存储,可以在正常的声明之前加上关键字static作为前缀. ...

  7. C语言中static关键字详解

    C语言中staic关键字很简单,简单到你的任何一个项目中可以不写一个staic关键字也是没有问题的.写这篇章主要是一下自己的staic的理解和应用,当然在章开头依旧要照本宣科简述一下static关键字 ...

  8. C语言中定义常量的关键字是什么,C++_详解C语言中const关键字的用法,关键字const用来定义常量,如 - phpStudy...

    详解C语言中const关键字的用法 关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const ...

  9. c语言中extern变量,C语言中的Extern用法

    C语言中的Extern用法 (2010-07-28 12:50:39) 标签: 杂谈 分类: 技术 C语言中的Extern用法 网上有很多帖子问C语言中Extern的用法,而且回答的详细程度各尽不同. ...

  10. C语言中typeof作用,浅析C语言中typeof关键字用法

    浅析C语言中typeof关键字用法 前言 C语言中 typeof 关键字是用来定义变量数据类型的.在linux内核源代码中广泛使用. 下面是Linux内核源代码中一个关于typeof实例: #defi ...

最新文章

  1. redis的集群搭建
  2. hiveSql常见错误记录
  3. Redis-相关概念记录
  4. 脚本在流程中的性能影响
  5. MATLAB并行实现的简单方法
  6. 手把手教你如何安装Mac OS X 图文详细教程
  7. swift -- Tuple 元组 Dictionary
  8. 张志华:机器学习的发展历程及启示
  9. Linux中buff-cache占用过高解决方案
  10. 我今天学习的技术,明天会不会一钱不值
  11. 高校成绩管理数据库系统
  12. YYLabel使用笔记
  13. 近期币圈与美股的相关性
  14. sysfader iexplore应用程序错误
  15. 我对于微信文章的感悟
  16. php获取手机本地,PHP通过API获取手机号码归属地
  17. ne_comment 表
  18. golang的运维开发
  19. 怎么更改计算机 盘符名称,怎么更改盘符,windows修改盘符方法
  20. 1、乐趣国学——“君子不器”

热门文章

  1. linux vi 编辑命令
  2. C#中yield关键字及注意事项
  3. MSE(Media Source Extensions)介绍
  4. 如何快速上手使用STM32库函数
  5. 我的程序员之路(英语的学习)
  6. 自己整理出来的一些标签
  7. openmv探索_2_追踪单颜色
  8. 句子表示学习前沿技术分享
  9. EMNLP'21 | 基于证据检索和图神经验证网络的表格事实验证模型
  10. 【推荐系统】BERT4Rec:使用Bert进行序列推荐