C语言 static 声明静态变量?大佬原来用它干这事!

天天见闻 天天见闻 2022-05-04 科技 阅读: 189
摘要: 这也就是在全局的时候,起的作用,将对应的变量,或者函数的可见范围,变成只对自身可见,对外不可见。c能访问,做的对修饰的变量或者函数进行限定。说完了全局变量,全局函数前面加,下来说下函数内部,添加的妙用。这样子不舒服的一点就是,本该是在add内部的一个变量,被丢到全局区域,这样子就会有个问题,会被本文件的其他地方调用,但我们设计的这个变量,只想让add函数用。

为什么要说这个?其实就是因为 关键字,有一个功能,就是会让局部变量本该在栈上,用这个声明后,就会进入全局区域,也就是从栈区域,进入到数据区域。

下面我们来看下代码:add.c

hello.c

我们这里看下,没有# “add.h”, 我们使用

gcc -o add.o -c add.c

gcc -o hello.o -c hello.c

gcc -o hello hello.o add.o

发现是可以编译过,也能链接过,也能运行。我们使用 -s add.o ,看到信息,add前面有个Bind的值是,这个就是说明,add是在可以让其他.o链接时候去查找的一个符号,它的类型是func函数。

然后我们把add.c 改成这个:(前面加上一个)

编译链接就会失败,找不到add方法,那么我们 -s add.o再看下:

add前面Bind的值变成了LOCAL,这时候对外就不可见了。这也就是在全局的时候,起的作用,将对应的变量static的作用,或者函数的可见范围,变成只对自身可见,对外不可见。

这个是为了降低重名的几率,也是防止自身的全局变量被外部访问,瞎修改的风险。

为了说明这个情况,我们来演示下这个过程,add.c改成这样:

hello.c 改成

编译执行后,最终结果输出17,是不是让我们一下子就不明白,a b两个值被外部随意修改,导致没法看懂代码业务。

我们看到有两个类型是 的数据,全局的,a和b。这样子这两个值就是可以被外部引用,进行修改的了。

如果我们把 add.c 中的 int a=5;改成 int a=5;那么最终链接的时候hello.o 就找不到a变量,导致链接失败。

这也就是的作用,让只想对当前的.c能访问,做的对修饰的变量或者函数进行限定。

于是,我们常规的模式就是,对内的都用进行修饰,然后放出对外函数,让其操作数据,保证入口的统一性,也更容易追踪。具体如下:

用静态修饰变量,不让外部直接访问,然后对外放出函数,让其通过函数修改数据,保证了入口的唯一性,这样子调试也很简单,直接在函数设置断点,打印堆栈,直接能找到调用方。

而如果说你让int a这种随意的变量放置到全局,就是一个灾难,会出现莫名奇妙被修改,找半天找不到被谁修改的问题。

说完了全局变量,全局函数前面加,下来说下函数内部,添加的妙用。

函数中的局部变量,默认是都在栈上面,这类变量最大的特点就是,函数返回之后,这段区域就会被其他函数调用时覆盖static的作用,重复利用,这也是栈的特点。

那么如果我们想做一个记数,用来记录这个 add 函数被调用的次数。该如何设计呢?

我们可以用一个全局静态变量来记录,比如 int =0;

然后在add方法里面进行记数,这样来操作。

这样子不舒服的一点就是,本该是在add内部的一个变量,被丢到全局区域,这样子就会有个问题,会被本文件的其他地方调用,但我们设计的这个变量,只想让add函数用。

于是,我们可以这样子处理:

int add()

{

int =0;

++;

a+b;

}

这样子操作后,就会从栈区域进到全局变量区域,但是又能保证只对add函数可见,其他函数都调用不到。

你说,妙哉否?

我们在学习一些语言,技巧的时候,尽量要去思考它的使用场景,这样子的话,你就知道,它的每个设计,都是为了解决一类问题,也就是需求推动设计。

好了,今天就说的这里,不知道你学的开心不开心?下一节我们来说下,关于 关键字的用法,这个比较简单,我们下一节见!

喜欢,帮忙转发~~

~~ end not end ~~

其他相关
【VBA基础】变量的类型和申明变量类型的重要性

【VBA基础】变量的类型和申明变量类型的重要性

作者: 天天见闻 时间:2024-03-30 阅读: 1
VBA中的变量类型及相关参数,详见上表,我们在申明变量时,要选择合适的变量类型。如果变量是时间,就要把变量申明为Date型(在工作表中,时间是数值的一种;但是在VBA中,要根据情况明确;申明数值时,还要根据数值的形式、范围选择合适的数值类型)4、所以大家可以看到正确申明变量的总要性。...
C语言运算符的优先级和结合性

C语言运算符的优先级和结合性

作者: 天天见闻 时间:2023-10-17 阅读: 53
本节将从一个示例开始说明,请查看下面的代码: #include stbio.h int main{ int a=16,b=4,c=2; int d=a+b*c; int e=a/b*c; printf(“d=%d,e=%d\n”,d,e); return0; 执行结果: d=24,e=8 1)对于式a+b*c,如果按照数学规则导出的话,应该计算乘法并计算加法,b*c的结果是8,a+8的结果是24,所以d的最终值也是24。从执行结果可以确认,我们的推论是,C语言也计算乘法来计算加法,和数学中的规则一样。...
嵌入式软件开发为什么选择C语言?

嵌入式软件开发为什么选择C语言?

作者: 天天见闻 时间:2022-12-23 阅读: 160
回到主题,为什么嵌入式软件开发选择C语言?能够直接访问硬件的语言有汇编和C语言,汇编属于低级语言,难以完成一些复杂的功能,但是汇编比C语言访问硬件的效率更高。开发工具在嵌入式软件开发中有重要的地位,大部分嵌入式软件开发工具都是针对C/C++编程语言。你会发现很多嵌入式C相关的工具链,而很少有C#、JAVA、PHP这些用于嵌入式的工具链。...
C语言:求最大公约数和最小公倍数!

C语言:求最大公约数和最小公倍数!

作者: 天天见闻 时间:2022-05-02 阅读: 204
相信大家对最大公约数和最小公倍数一定不会陌生吧,那么在这里我就不做太多的解释了,直接上代码:#4:a:c:2:b:1:c:c:a:9:9:1:a:f:7:1:c:e:8:c:1:0:3:2:0:2:c:b:b:d:1:6#方法1和方法2其实是一样的,就是函数中的两种不同表示而已,大家选择自己比较熟悉的方法写就行了!...
判断语句_如何学好C语言判断语句?攻略if语句是第一步

判断语句_如何学好C语言判断语句?攻略if语句是第一步

作者: 天天见闻 时间:2022-04-10 阅读: 218
在操作符章节中我们学习过问号表达式,也就是当某一个条件表达式是真时,问号表达式的结果为冒号前的结果,当条件表达式是假时,问号表达式的结果为冒号后的结果。这里我们可以分析一下,问号表达式其实是一个条件判断功能表达式,也就是说:以上就是c语言中if语句的用法是什么的详细内容,如果你想更好的提升你的编程能力,好好学习C/C++编程知识的话!...
编程入门先学什么?

编程入门先学什么?

作者: 天天见闻 时间:2022-03-17 阅读: 333
C语言语法简单,有良好的逻辑抽象,入门的话还是先面向过程吧,不要刚学就面向对象云里雾里的,如果是要更全面、深入的学习语言本身就C.入门是从Basic语言开始的,大概熟悉程序的基础语法与逻辑后,进阶C语言。编程入门后,其实学什么语言已经不太重要了(主要看计划的发展方向)。把程序设计的逻辑搞懂了,学什么语言都很快。编程学习没有捷径可走,只有入门快慢之分。...
我来说两句

年度爆文