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有三种情况 ...
随机推荐
- 爬取疫情数据,以django+pyecharts实现数据可视化web网页
在家呆着也是呆着,不如做点什么消磨时间呗~ 试试用django+pyecharts实现疫情数据可视化web页面 这里要爬疫情数据 来自丁香园.搜狗及百度的疫情实时动态展示页 先看看劳动成果: 导航栏: ...
- 01-if条件语句之数字比较
if条件语句之数字比较 #!/bin/bash # 使用expr命令,比较结果正确,输入1,错误输入0 expr_mode(){ if [ $(expr $1 \<\= $2) -eq 1 ]; ...
- Redis03——Redis是如何删除你的数据的
众所周知Redis针对每一个key都能单独设置过期时间,那么Redis是怎么处理这些key的过期时间的呢?当同一时间有大量Key同时到期时,Redis又是怎么处理的呢?会不会影响到我的线上业务呢?如果 ...
- Android微信逆向--实现发朋友圈动态
0x0 前言 最近一直在研究Windows逆向的东西,想着快要把Android给遗忘了.所以就想利用工作之余来研究Android相关的技术,来保持对Android热情.调用微信代码来发送朋友圈动态一直 ...
- express第三方中间件研究之bodyParser中间件
转载至:http://www.cnblogs.com/lianer/p/5178693.html 接触nodejs已有一段时间了,但最近才开始落实项目,于是使用express应用生成器生成了一个应用. ...
- 「踩坑记」Android API 判断权限申请结果的闪退问题
这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题.权限的申请使用的语句为: ActivityCompat.requestPermissions(this, ne ...
- Spring Cloud 系列之 Netflix Hystrix 服务容错
什么是 Hystrix Hystrix 源自 Netflix 团队于 2011 年开始研发.2012年 Hystrix 不断发展和成熟,Netflix 内部的许多团队都采用了它.如今,每天在 Netf ...
- [深入学习C#] 匿名函数、委托和Lambda表达式
匿名函数 匿名函数(Anonymous Function)是表示“内联”方法定义的表达式.匿名函数本身及其内部没有值或者类型,但是可以转换为兼容的委托或者表达式树类型(了解详情).匿名函数转换的计算取 ...
- Java循环和数组练习题:打印素数升级版
前两天一个小伙伴问了我一个数组的练习题,我一看思路很清晰,就是打印素数加了个数组.没想到写的时候啪啪打脸,终究还是没逃过眼高手低.本来不打算发出来了,因为发出来愈发显得我很菜,最后还是打算分享出来,一 ...
- ImportError: libcusolver.so.8.0: cannot open shared object file: No such file or directory
问题描述: ImportError: libcusolver.so.8.0: cannot open shared object file: No such file or directory 首先检 ...