C语言中static extern的使用
10:30:22 2019-08-20
基础不牢 瞬间爆炸
参考资料:https://blog.csdn.net/ts_54eagle/article/details/4418627
https://blog.csdn.net/xingjiarong/article/details/47656339
https://blog.csdn.net/xingjiarong/article/details/47656339
看看C Primer Plus上是怎么定义的
先说说作用域 分为4种:块作用域 函数作用域 函数原型作用域 文件作用域
这里要说明的是 块作用域指{}之间的部分
而函数作用域单单指goto标签 当goto标签出现在函数内部时 goto标签作用域蔓延至整个函数
函数原型作用域从形参定义到原型声明结束为止
文件作用域指的是 该文件 该文件 该文件 从变量定义到文件末尾都可见
链接分为3种:外部链接 内部链接 无链接 (决定了是否能被外部文件使用)
块作用域 函数作用域 函数原型作用域的变量 都属于无链接
文件作用域的变量 可以属于外部链接 也可属于内部链接
内部链接的文件作用域 称为 文件作用域(只能在该文件内部使用)
外部链接的文件作用域 称为 全局作用域(整个程序都可使用)
一个具有文件作用域的变量默认是具有全局作用域的 在前面加上static变为具有文件作用域
C对象有4种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期。
如果某个变量具有静态存储期,该变量在程序运行过程中一直存在 文件作用域具有静态存储期
在具有文件作用域的变量前加上static 表示该变量的作用域限制为内部链接
对于所有的具有文件作用域的变量(无论它具有内部链接还是外部链接)都具有静态存储期 而声明了static的文件作用域的变量具有内部链接
存储类别 | 存储期 | 作用域 | 链接 | 声明方式 |
自动 | 自动 | 块 | 无 | 块内 |
寄存器 | 自动 | 块 | 无 | 块内 使用关键字register |
静态外部链接 | 静态 | 文件 | 外部 | 所有函数外 |
静态内部链接 | 静态 | 文件 | 内部 | 所有函数外 使用关键字register |
静态无链接 | 静态 | 块 | 无 | 块内 使用关键字register |
auto: 默认情况下 声明在块内和函数头中的变量都是auto类型的变量 也可以显式的在变量声明时写上auto auto变量在使用时在栈上申请空间 使用结束后自动销毁
register:寄存器变量存储在寄存器中
static:对于局部变量来说 声明为static 在使用时只会声明一次 之后不会再声明 对变量的改变会被保存(对它进行改变是在定义改变量的块中 或者通过变量的指针)这样改 局部变量具有了静态存储期
对于外部变量(具有文件作用域的变量)来说 static会将该变量声明为内部链接
extern:用extern声明 表明变量定义在别处 (extern也是声明 是引用性声明 不是定义性声明)
在使用另外一个文件中的全局变量时要用extern声明 这让人有些迷惑 前面说 声明为外部变量(未加static)具有全局作用域 那不就是能被其它文件使用了吗 这样的想法是错误的
c primer puls解释的很清楚 :如果外部变量定义在一个文件中,那么其它文件在在使用该变量前必须先声明它(用extern声明)。也就是说,在某文件中对外部变量进行定义式声明只是单方面允许其它文件使用改变量,其它文件在用extern声明之前不能直接使用它
对于自动变量来说 未初始化 它中的数据是垃圾
对于具有静态生存期的变量来说 如果未初始化 它里面的数据为0
例子:
main.c
#include <stdio.h>
void fun();
int main()
{
fun();
fun();
return ;
}
void fun()
{
int num2=;
static int num1;
printf("num1 is:%d\n",num1);
printf("num2 is:%d\n",num2);
num1++;
num2++;
}
输出结果:
可以看到 num1保存了上次的值
//file1.c
int num1=;
static int num2=; //file.c
#include <stdio.h>
extern int num1;
extern int num2; //这句话只是说明num2是定义在另一个文件中的 但num2是不具有外部
//链接的 所以下面是无法使用的
int main()
{
printf("%d",num1);
//printf("%d",num2); //这句话是错的
return ;
}
//file1.c
#include<stdio.h>
void fun()
{
printf("fun()");
} //file2.c
#include <stdio.h>
extern void fun();
int main()
{
fun();
return ;
}
extern也可以对函数进行引用式声明
C语言中static extern的使用的更多相关文章
- C语言中static的作用及C语言中使用静态函数有何好处
转自:http://www.jb51.net/article/74830.htm 在C语言中,static的作用有三条:一是隐藏功能,二是保持持久性功能,三是默认初始化为0. 在C语言中,static ...
- C语言中static的使用方法【转】
本文转自:http://blog.csdn.net/renren900207/article/details/21609649 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量 ...
- c语言中static 函数和普通函数的区别
C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放 ...
- C语言中static用法介绍
C语言中static用法介绍 对于新手来说,很多东西的用法还不是很清楚,我们今天一起来看看C语言中static用法介绍 1.声明了static的变量称为静态变量,根据作用域的不同又分为 ...
- C语言中static关键字的作用
static的作用(精辟分析) 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加sta ...
- C语言中static作用
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有 ...
- C语言中static关键字的用法
C记得还是大一时学的,现在觉得好久没用了,又捧起来看看.今天刚看到有关static关键字,仔细地看了一遍<C和指针>这本书中的解释,现在觉得清楚多了. 首先,我们将static关键字,修饰 ...
- 在不同语言中static的用法
static (计算机高级语言) 编辑 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN.ALGOL.COBOL.BA ...
- 对C语言中static的理解
对C语言中的static关键字的深入理解 在一次面试的时候面试官问我static全局变量与全局变量的区别,之前虽然用过但是并没仔细去搞懂他,这次来细心的学习一下. 基本概念 使用static有三种情况 ...
随机推荐
- 编写程序实现根据考试成绩将成绩分为A,B,C,D四档。
score = float(input("请输入你的成绩:"))if 90 <= score <= 100: print("你的成绩为A档")eli ...
- 树莓派3b+ 交叉编译 及升级 kernel
安装 gcc pkg 等工具sudo apt-get install build-essential git 官方介绍 https://www.raspberrypi.org/documentatio ...
- AX中Json转化成表记录
static void JsonToTable(str _json,Common _Common){ sysdictTable dictTable; TableId ...
- css 固比固模型
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 2020年IOS超级签最新实现原理详解
相信2019年最火的应该就是这个东西了,我也是摸着石头过河,勉强混进了这个行业! 超级签这个东西吧,说白了就是用个人账号分发应用,大致分成以下几个步骤吧 一.使用配置文件获取UDID 苹果公司允许开发 ...
- iview mock main.js
main.js // 实际打包时应该不引入mock /* eslint-disable */ // if (process.env.NODE_ENV !== 'production') require ...
- 关于WPF System.windows.Media.FontFamily 的类型初始值设定项引发异常问题解决方法
造成原因:此问题的根本原因是.NET Framework January 2018 Rollup(KB4055002)与已安装的.NET Framework 4.7.1产品版本之间的MSI安装交互.R ...
- mysql & Tomcat使用问题记录
mysql使用问题记录 1.mysql如何修改root密码 a.进入mysql安装目录b.登录 mysql -u root -pc.修改密码 mysql> SET PASSWORD FOR ro ...
- 毕业设计——基于ZigBee的智能窗户控制系统的设计与实现
题目:基于物联网的智能窗户控制系统的设计与实现 应用场景:突降大雨,家里没有关窗而进水:家中燃气泄漏,不能及时通风,威胁人身安全,存在火灾的隐患:家中窗户没关,让坏人有机可乘.长时间呆在人多.封闭的空 ...
- [UWP]使用AlphaMaskEffect提升故障艺术动画的性能(顺便介绍怎么使用性能探测器分析UWP程序)
前几天发布了抄抄<CSS 故障艺术>的动画这篇文章,在这篇文章里介绍了如何使用Win2D绘制文字然后配合BlendEffect制作故障艺术的动画.本来打算就这样收手不玩这个动画了,但后来又 ...