首页 > 其他分享 >C语言中extern?

C语言中extern?

时间:2022-11-29 19:56:44浏览次数:34  
标签:存储 变量 int C语言 extern 全局变量 函数

C语言中的变量有哪些存储类型,你还记得吗?extern如何使用你都掌握了吗?看了本文你就清楚了。

1、 回顾C语言变量

C语言中变量值的存储位置有两类:CPU的寄存器和内存。变量存储类型关系到其存储位置,除了register型存储在CPU寄存器中,C语言提供的其它三种存储类型(auto型、static型、extern型)的变量均存储在内存中。存储位置不同,决定了变量的生存期和作用域。

从时间角度来说,C语言中变量分为静态存储和动态存储两种情况。静态存储指的是变量存储在内存的静态存储区,程序编译时就为其分配空间并初始化,占有固定存储单元直至程序结束。而动态存储指的是变量存储在内存的动态存储区,一般用于存储函数中的临时变量(声明为static型的变量除外),只有函数被调用,此类型变量才被分配空间,函数调用结束时该变量空间将会被释放。

从空间角度来说,C语言中变量分为局部变量和全局变量,其有效作用范围称为作用域。局部变量通常定义在函数内部或符合语句内,其仅在函数内部或符合语句内有效,程序编译阶段不会给其分配空间,仅在运行阶段临时分配,运行结束即释放空间。全局变量指的是在函数以外定义的变量,其作用范围为从定义处开始到所在程序文件结束。编译阶段开始分配固定空间,程序运行期间始终占有该空间不变。

整体来讲,全局变量和声明为static型的局部变量存储在内存的静态存储区;局部变量存储在内存的动态存储区。

2、 extern的变量声明

我们知道,在函数外部定义的变量称为全局变量,其存储方式为静态存储,生存期为整个程序的运行周期,作用范围即作用域为从定义处到所在文件结束。那么我们想在全局变量作用范围之外使用它该怎么办呢?事实上,C语言中extern关键字就是用作“外部变量声明”,起到扩展外部变量作用域的作用。

通常C语言是以源文件为编译单位的,一个程序可以包含一个或多个源文件,每个源文件包含一个或多个函数。但是程序不管有几个源文件,extern的用法都是相同的,我们分这两种情况来说明。

1) 单个源文件的情况

对于单个源文件的程序,如果某个全局变量不是在文件开头定义,而是在中间某个位置,那么如果在定义位置之前的函数想使用这个全局变量,则可以采用extern来声明变量。例如,下面示例程序中全局变量g_a定义在main函数之后,要想在main函数中使用已经超出了g_a的作用域,这里就可以采用extern声明,即可使用,程序输出结果为10。

#include <stdio.h>

void prtValue(int x);

int main(void)

{

extern int g_a;

prtValue(g_a);

return 0;

}

int g_a = 10;

void prtValue(int x)

{

printf(“%d”,x);

}

2) 多个源文件情况

假定某程序包含file1.c和file2.c两个文件。file1.c文件中定义了一个int型全局变量g_b,如果file2.c文件中某函数想使用g_b变量,只需要在file2.c文件的使用位置之前(通常为文件开头位置)通过“extern int g_b;”语句进行外部变量声明即可使用。

如果某程序包含多个源文件(模块),一个源文件中定义了全局变量,其它多个源文件均需要使用该全局变量,只需要在各使用此全局变量的文件中通过extern对全局变量进行声明即可使用。值得注意的是,这种情况下涉及到多个文件对一个变量的操作,某个文件修改了变量的值,可能会影响其他文件的使用,需谨慎使用。

3、 其它使用

此外extern也可用于函数的外部链接声明。我们知道函数的声明(定义)也可以包括存储类型,但只有extern/static两种。当函数声明为extern,说明函数具有外部链接,其它文件可以调用此函数;当函数声明为static,说明函数是内部链接,即只能在定义函数的文件内部调用函数;当不指明函数存储类型,则默认该函数具有外部链接。通过如下声明语句,我们看到函数fun1和fun3都具有外部链接,因此,如果不限定函数为内部链接的情况下,也无需通过extern特意声明为外部链接,因为它默认已经具有外部链接了。

extern int fun1(int x); //外部链接

static int fun2(char c); //内部链接

int fun3(int i); //外部链接

标签:存储,变量,int,C语言,extern,全局变量,函数
From: https://www.cnblogs.com/amxiang/p/16936511.html

相关文章

  • 【C语言基础】C语言实现矩阵相乘
    前言最近在考虑如何实现kalman跟踪,其中涉及较多矩阵运算,比如矩阵相乘、矩阵转置等,先实现了一个矩阵相乘的c代码如下。其实,后续可以使用matrix类实现kalman跟踪。code#......
  • 【转】C语言表驱动法编程实践
    来源:C语言表驱动法编程实践(精华帖,建议收藏并实践)(qq.com)数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据结......
  • 【转】嵌入式C语言代码优化方案
    来源:嵌入式C语言代码优化方案(深度好文,建议花时间研读并收藏)(qq.com)1、选择合适的算法和数据结构选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量......
  • C语言进阶题库
    C语言进阶题库​​1.约瑟夫生者死者小游戏​​​​2.五人分鱼​​​​3.有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?​​​​4.企业发放的奖金根......
  • c语言自定义输出小数点位数
    C语言中常用的小数有两种类型,分别是float或double;float称为单精度浮点型,double称为双精度浮点型。不像整数,小数没有那么多幺蛾子,小数的长度是固定的,float始终占用4个......
  • C语言中 char s[] 和 char* s 的区别
    chars[]和char*s的区别1、数组本质2、指针指针的指向3、字符数组4、char*与chara[]5、char**和char*a[]char*a[]char**sC语言指针可......
  • C语言递归算法解决李白打酒问题
    一、概念递归算法(英语:recursionalgorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此......
  • 用c语言求出p=n!/(n-m)!
    #include<stdio.h>intmain(){ intm,n,P; intf(intx);     /*声明函数*/  printf("请输入mandn的值!\n");  scanf("%d%d",&m,&n); P=f(n)/f(n-m)......
  • C语言结构体对齐
    结构对齐规则结构体(struct)的数据成员,第一个数据成员存放的地址为结构体变量偏移量(offset)为0的地址处。结构体成员自身对齐时,存放的地址为有效对齐值=min{自身对......
  • C语言——操作符
    1.算术操作符: + - * / % 注意:%前后两个数都要是整形2.移位操作符: >>右移操作符。{2.1算术右移:右边丢弃,左边补符号位。2.2逻辑右移:右边丢弃,左边补0.}<<左移操作......