static和extern

1.extern  

  extern 是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使⽤ extern 进⾏声明,然后使⽤。
  即在一个源文件中想要使用另一个源文件,即可通过这个extern来声明使用。

2.static

  static 是 静态的 的意思,可以⽤来:

修饰局部变量

修饰全局变量

修饰函数
在讲解 static extern 之前再讲⼀下:作⽤域和⽣命周期。
作用域(scope)是程序设计概念,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤)的,⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。
1. 局部变量的作⽤域是变量所在的局部范围。
2. 全局变量的作⽤域是整个⼯程(项⽬)。
⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段。
1. 局部变量的⽣命周期是:进⼊作⽤域变量创建,⽣命周期开始,出作⽤域⽣命周期结束。
2. 全局变量的⽣命周期是:整个程序的⽣命周期。

A.static 修饰局部变量:

//代码1 #include <stdio.h>
void test()
{int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for(i=0; i<5; i++){test();}return 0; }
//代码2 #include <stdio.h>
void test()
{//static修饰局部变量static int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for(i=0; i<5; i++){test();}return 0; }
  对⽐代码1和代码2的效果,理解 static 修饰局部变量的意义。
  代码1的test函数中的局部变量i是每次进⼊test函数先创建变量(⽣命周期开始)并赋值为0,然后
++,再打印,出函数的时候变量⽣命周期将要结束(释放内存)。
  代码2中,我们从输出结果来看,i的值有累加的效果,其实 test函数中的i创建好后,出函数的时候是不会销毁的,重新进⼊函数也就不会重新创建变量,直接上次累积的数值继续计算。
 这里我们可以了解一下内存,下面是我的独家笔记哦:
 
  结论:static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变 量和全局变量是⼀样的,⽣命周期 就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才 回收。但是作⽤域不变的。
  使⽤建议:未来⼀个变量出了函数后,我们还想保留值,等下次进⼊函数继续使⽤,就可以使⽤static修饰。

B.static修饰全局变量

这里是在一个大文件中有多个源文件

 代码1

add.c

int g_val = 2018;

test.c

#include <stdio.h>
extern int g_val;
int main()
{printf("%d\n", g_val);return 0;
}

 代码2

add.c

static int g_val = 2018;

test.c

#include <stdio.h>
extern int g_val;
int main()
{printf("%d\n", g_val);return 0;
}

  对比上述两个不同的代码,我们可以得到结论:

  ⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤。 本质原因是全局变量默认是具有外部链接属性的,在外部的⽂件中想使⽤,只要适当的声明就可以使⽤;但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤了,其他源⽂件,即使声明了,也是⽆法正常使⽤的。
  使⽤建议:如果⼀个全局变量,只想在所在的源⽂件内部使⽤,不想被其他⽂件发现,就可以使⽤static修饰。

C.static 修饰函数

  static 修饰函数与修饰全局变量是一样的道理的。

代码1

add.c

int Add(int x, int y)
{return x+y;
}

test.c

#include <stdio.h>
extern int Add(int x, int y);
int main()
{printf("%d\n", Add(2, 3));return 0; }

代码2

add.c

static int Add(int x, int y)
{return x+y;
}

test.c

#include <stdio.h>
extern int Add(int x, int y);
int main()
{printf("%d\n", Add(2, 3));return 0; }

  对比运行结果有:代码1是能够正常运⾏的,但是代码2就出现了链接错误。

结论:

  其实 static 修饰函数和 static修饰全局变量是⼀模⼀样的,⼀个函数在整个⼯程都可以使⽤,
被static修饰后,只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了。 本质是因为函数默认是具有外部链接属性,具有外部链接属性,使得函数在整个⼯程中只要适当的声明就可以被使⽤。但是被 static 修饰后变成了内部链接属性,使得函数只能在⾃⼰所在源⽂件内部使⽤。
  使⽤建议:⼀个函数只想在所在的源⽂件内部使⽤,不想被其他源⽂件使⽤,就可以使⽤ static 修饰。

小笔记:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未来制造业的新引擎:工业机器人控制解决方案

制造业正经历着一场革命性的变革 在这个变革的浪潮中&#xff0c;工业机器人成为推动制造业高效生产的关键力量。然而&#xff0c;要发挥机器人的最大潜力&#xff0c;一个强大而智能的控制系统是必不可少的。在这个领域&#xff0c;新一代的工业机器人控制解决方案正崭露头角&…

学习MySQL先有全局观,细说其发展历程及特点

学习MySQL先有全局观&#xff0c;细说其发展历程及特点 一、枝繁叶茂的MySQL家族1. 发展历程2. 分支版本 二、特点分析1. 常用数据库2. 选型角度及场景 三、三大组成部分四、总结 相信很多同学在接触编程之初&#xff0c;就接触过数据库&#xff0c;而对于其中关系型数据库中的…

这样写postman实现参数化,阿里p8都直呼牛逼

什么时候会用到参数化 比如&#xff1a;一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块&#xff1a;正确的用户名&#xff0c;密码 成功&#xff1b;错误的用户名&#xff0c;正确的密码 失败 postman实现参数化 在实际的接口测试中&#xff0c;部分参数…

你的关联申请已发起,请等待企业微信的管理员确认你的申请

微信支付对接时&#xff0c;需要申请AppID,具体在下面的位置&#xff1a; 关联AppID&#xff0c;发起申请时&#xff0c;会提示这么一句话&#xff1a; 此时需要登录企业微信网页版&#xff0c;使用注册人的企业微信扫码登录进去&#xff0c;然后按照下面的步骤操作即可。 点击…

iEnglish全国ETP大赛:教育游戏助力英语习得

“seesaw,abacus,sword,feather,frog,lion,mouse……”11月18日,经过3局的激烈较量,“以过客之名队”的胡玲、黄长翔、林家慷率先晋级“玩转英语,用iEnglish”第三届全国ETP大赛的16强,在过去的周末中,还有TIK徘徊者队、不负昭华队、温柔杀戮者队先后晋级。据悉,根据活动规则,在…

电脑内存升级

ddr代兼容 自从DDR内存时代开启之后&#xff0c;只要满足内存的插槽规格相同(DDR3或DDR4或DDR5即为内存规格)这一条件&#xff0c;不同品牌、不同频率以及不同容量的茶品都可以一起使用&#xff0c;除了品牌和容量的影响之外&#xff0c;不同频率的搭配可能会造成性能方面的影…

面试官:什么是三色标记

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

git提交时会将target也提交

有时候大家在提交git时发现会将编译文件target也提交上去&#xff0c;这种情况有以下几种情况 情况1&#xff1a;项目没有设置.gitignore 情况2&#xff1a;设置了.gitignore但是依然会提交。 第一种&#xff1a;添加.gitignore&#xff0c;并在文件中添加需要忽略的东西。 …

redis分布式锁的学习记录

核心性质 独占性&#xff1a;对于同一把锁&#xff0c;同一时刻只能被一个加锁方独占 健壮性&#xff1a;不能产生死锁。如果有一个因为宕机无法主动解锁&#xff0c;锁也应该被正常加载 对称性&#xff1a;加成和解锁的使用方必须为同一个身份&#xff0c;不允许被非方释放 高…

HCIA-实验命令基础学习:

视频学习&#xff1a; 第一部分&#xff1a;基础学习。 19——子网掩码。 27——防火墙配置&#xff1a; 32——企业级路由器配置&#xff1a; 基础实验完成&#xff1a;&#xff08;完成以下目录对应的实验&#xff0c;第一部分基础实验就完成。&#xff09; 方法&#xff…

C //习题 8.13 写一个用矩形法求定积分的通用函数,分别求

C程序设计 &#xff08;第四版&#xff09; 谭浩强 习题8.13 习题 8.13 写一个用矩形法求定积分的通用函数&#xff0c;分别求 ∫ 0 1 s i n x d x &#xff0c; ∫ 0 1 c o s x d x &#xff0c; ∫ 0 1 e x d x \int_{0}^{1}sinx\ dx&#xff0c;\ \ \int_{0}^{1}cosx\ …

ILI9225 TFT显示屏16位并口方式驱动

所用屏及资料如后图&#xff1a; ILI9225&#xff0c;176*220&#xff0c;8位或16位并口屏&#xff0c;IM0接GND&#xff0c;电源及背光接3.3v 主控&#xff1a;CH32V307驱动&#xff08;库文件和STM32基本一样&#xff09; 一、源码 ILI9225.c #include "ILI9225.h&quo…

设计模式(二)-创建者模式(4)-原型模式

一、为何需要原型模式&#xff08;Prototype Pattern&#xff09;? 在软件设计中&#xff0c;我们会遇到到这样的情况&#xff1a;对原对象进行拷贝一个新的副本。想要实现这样的逻辑&#xff0c;有一种笨方法就是对原对象里的所有变量进行逐一赋值。但是这样的做法会导致代码…

【SpringCloud】认识微服务、服务拆分以及远程调用

SpringCloud 1.认识微服务 1.1单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署 单体架构的优缺点&#xff1a; **优点&#xff1a;**架构简单&#xff0c;部署成本低 **缺点&#xff1a;**耦合度高&#xff08;维护困难&…

【C++】郭老二博文之:C++目录

1、POCO 【POCO】POCO学习总结&#xff08;一&#xff09;–下载与编译 【POCO】POCO学习总结&#xff08;二&#xff09;——配置选择 【POCO】POCO学习总结&#xff08;三&#xff09;——交叉编译 2、C11 2.1 STL算法 【C】C11 STL算法(一)&#xff1a;非修改序列操作&a…

笔记59:序列到序列学习Seq2seq

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a a a a a a a a a

C++ Day04 this指针,友元函数,重载

this指针 概念 谁调用 this 所在的函数 ,this 就存储谁的地址 特点 1, 在当前类的非静态成员函数中调用本类非静态成员时 , 默认有 this 关键字 2, 静态成员函数 , 没有 this 指针。 示例 #include <iostream> #include <cstring> using namespace std; class S…

前后端分离项目跨域请求的问题与解决办法

目录 一、为什么会存在跨域请求&#xff1f; 二、跨域请求的流程&#xff1f; 三、什么情况下会触发CROS机制&#xff1f; 四、如何解决跨域请求导致的问题&#xff1f; 一、为什么会存在跨域请求&#xff1f; 跨域请求是因为浏览器的同源策略引起的。同源策略是浏览器的一种…

算法刷题-动态规划2

算法刷题-动态规划2 珠宝的最高价值下降路径最小和 珠宝的最高价值 题目 大佬思路 多开一行使得代码更加的简洁 移动到右侧和下侧 dp[ i ][ j ]有两种情况&#xff1a; 第一种是从上面来的礼物最大价值&#xff1a;dp[ i ][ j ] dp[ i - 1 ][ j ] g[ i ][ j ] 第二种是从左…