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有三种情况 ...
随机推荐
- JavaScript(js)函数声明与函数表达式的区别
在JavaScript中,函数是经常用到的,在实际开发的时候,我想很多人都没有太在意函数的声明与函数表达式的区别,但是呢,这种细节的东西对于学好js是非常重要的. 函数声明与函数表达式用代码写出来是这 ...
- openwrt sdk 添加软件包 Makefile 写法
参考 https://openwrt.org/start?id=docs/guide-developer/packages ,英文稍好点的自己看吧,我写出来也就是方便,英文不好的人看. 软件包的来源, ...
- 修改js文件,引发的404问题
记录一个bug,本地测不出来,客户后台却404,web测试可参考.(不知道是不是通用的) 先介绍下背景 我们是web产品,存在发布机.管理机.js文件,页面会引用到这些js文件.出于安全考虑,规定js ...
- cooke和session
一.装饰器要加入funtools.wrap装饰 保留函数的元数据(函数名/注释) 1.装饰器 def wrapper(f): def inner(*args,**kwargs): return f(* ...
- C++ 按行读取文件并打印
#include<iostream> #include<fstream> #include<string> #include <vector> #inc ...
- angular http 节流
有时候点列表但是由于查询问题,后端返回数据的速度很慢,导致回来的顺序错乱,后端解决不了,前端来 在jq年代 像标志位 防抖 节流等 在angular里使用了rxjs //错误示范 getIntelli ...
- volatile 手摸手带你解析
前言 volatile 是 Java 里的一个重要的指令,它是由 Java 虚拟机里提供的一个轻量级的同步机制.一个共享变量声明为 volatile 后,特别是在多线程操作时,正确使用 volatil ...
- CKafka如何助力腾讯课堂实现百万消息稳定互动?
疫情期间,为了保障国内学子的正常学习进度,腾讯课堂积极响应国家“停工不停学”的号召,紧急上线疫情期间专用的“老师极速版”,使广大师生足不出户,即可快速便捷的完成线上开课.面对线上课堂百万量级的互动消息 ...
- Web_jQuery
第1章: jQuery简介 为了简化 JavaScript 的开发,一些 JavsScript 库诞生了. JavaScript库封装了很多预定义的对象和实用函数,简化HTML与JavaScript之 ...
- Selenium IDE安装及简介
一.Selenium IDE安装 Selenium IDE是Firefox浏览器的一个插件,依附于Firefox浏览器.在网上搜了Selenium IDE的安装教程,大部分都是说在官网下载安装,其实最 ...