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有三种情况 ...
随机推荐
- linux命令行界面如何安装图形化界面
linux命令行界面如何安装图形化界面 目录 问题描述 解决方案 安装包 测试是否安装成功 如何卸载图形化界面 遭遇问题 问题描述 当我们在安装Linux系统时,我们一开始可能安装的是非图形界面的系统 ...
- 致远·面向人工智能-逐浪CMS v8.1.2全面发布[全球首个基于dotNET core3.0的中文CMS]
原文:https://www.z01.com/down/3484.shtml 再远, 我都不会停息, 因为技术而生, 因为技术而强, 这是逐浪软件的命与根! 全新打造, 三百多项超级功能, 助你十分钟 ...
- 自动控制理论的MATLAB仿真实例(二)
%求方程的解 x=sym('x'); fx=(3*x*x+2*x)*(x*x+2.32*x+4)-(2*x+2.32)*(x*x*x+x*x) fx =
- 关于SDL的一些坑:找不到WinMain,不显示控制台,添加链接库等
目录: 用CMake构建SDL时报错 Gcc添加链接库 Gcc找不到入口(WinMain) 让SDL启动时不带控制台窗口 用CMake构建SDL时报错 root@ubuntu:~/SDL# cmake ...
- HTML每日学习笔记(2)
7.16.2019 1.html表单:用于得到用户不同类型的输入 <form>元素定义表单: <form> First name:<br> <input ty ...
- Linux命令进阶篇-文件查看与查找
上一篇的博客对于Linux如何在不同目录下跳转和查看目录下内容做出了总结,主要靠cd和ls,很常见也很实用.但是你看到目录下面那么多不同花花绿绿的文件,心里是不是痒痒,是不是想进去一探究竟,有办法! ...
- 9. selenium+request方式的cookie绕过
1. 首先确认POST请求的content-type类型 2. 查看cookies数据 3. 找到对应的headers数据 4. 如果是application/json,传入的json数据需要时jso ...
- [转载] 全局键盘钩子(WH_KEYBOARD)
为了显示效果,在钩子的DLL中我们会获取挂钩函数的窗体句柄,这里的主程序窗体名为"TestMain",通过FindWindow查找. KeyBoardHook.dll代码 libr ...
- cmdb 配置
cmdb客户端文件夹创建 客户端:client:-bin:启动文件-src:源文件(核心代码)-conf:配置文件-lib:全局的一些方法 和配置-test:测试文件
- Springboot CORS跨域访问
Springboot CORS跨域访问 什么是跨域 浏览器的同源策略限制: 它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础 ...