当前位置:首页 > 公众号精选 > C语言与CPP编程
[导读][导读] static的用法对于很多刚刚开始接触开发的朋友来说,可能没理解其真正的用途, 虽说这个是老生常谈的话题 ,但这也是高频面试要点,所以本文来聊聊。 最近有点小忙,更文慢了些,抱歉。 先谈存储类型 存储类型表示变量的可见性和位置。它告诉可以从代码

[导读] static的用法对于很多刚刚开始接触开发的朋友来说,可能没理解其真正的用途, 虽说这个是老生常谈的话题 ,但这也是高频面试要点,所以本文来聊聊。

最近有点小忙,更文慢了些,抱歉。

先谈存储类型

存储类型表示变量的可见性和位置。它告诉可以从代码的哪一部分访问变量。存储类用于描述以下内容:

  • 变量的作用域(scope),作用域指存取变量的代码范围。
  • 变量从哪里分配存储内存。
  • 变量的初始化值。
  • 变量的生命周期(lifetime),生命周期指存取变量的时间范围,从程序运行时角度去考察变量的。

那么有哪些存储类型呢?下面几个词是C语言描述存储类型的关键字:

  • auto : 自动型,为变量的默认存储方式,作用域从定义点到该局部程序块尾部,分配存储在栈内,生命周期程序运行至定义点出生,到程序运行退出该块时消亡。
  • extern:外部型,作用域为整个程序,其分配存储在数据段,生命周期为整个程序运行生命周期。
  • static:静态型,其分配存储在数据段,故其生命周期为整个程序运行生命周期,其作用域分两种情况:
    • 定义在文件中,则作用域为定义点至该文件尾部。
    • 定义在函数中,则作用域为定义点至该函数尾部。
  • register:寄存器型,寄存器存储类用于定义应存储在寄存器而不是RAM中的局部变量。 这意味着该变量的最大位长度等于寄存器的位长度(通常是一个字),并且不能对其使用'&'运算符(因为它没有存储在内存中)。仅应用于需要快速访问的变量(例如计数器)。还应注意定义“register”并不意味着变量将一定会存储在寄存器中。它可能根据不同硬件和实现限制存储在寄存器中。

由static来谈C封装

static用在文件中修饰变量,如下代码:

/*这是某模块文件,比如叫senor.c*/
#include "sensor.h"
static float sensor_value;
static float filter(float in)
{
    float out;
    
    /*这里实现滤波计算*/
    ......
        
    return out;
}
void update_sensor_exe(void)
{
     float temp   = adc_read();
     sensor_value = fileter(temp);
}

float get_sensor_value(void)
{
    return sensor_value;
}

这里定义其头文件,比如sensor.h

#ifdef  __SENSOR_H__
#define __SENSOR_H__

void update_sensor_exe(void);

#endif

用一个UML图来描述一下这个模块:

这样使用,是不是有点模块封装的意思呢,来总结一下:

  • 利用static定义属于模块的变量,可以将属于模块属性隐藏在模块内部,对外部不见,是不是有点类似对象语言中的private变量的赶脚呢?
  • static修饰函数成局部函数是不是也相当于面向对象语言中一个类的私有方法呢?如此,外部程序是无法调用filter函数的。
  • update_sensor_exe/get_sensor_value 为模块对外接口,这样一来使用者就可以不关心模块内部究竟是怎么做的,可以看成是个黑盒子,只需要知道update_sensor_exe更新了传感器采集,而调用get_sensor_value则可以返回获取到当前的测量数据。
  • static修饰变量可为广义对象,比如struct。这样可以将相关属性更为紧凑的封装,事实上这种用法是非常好的用法,也被广为使用。
  • C语言在多人协同开发时,利用static的这种用法时,系统设计人员定义模块或子系统接口,可以很好的解决同名变量/函数冲突,有利于协同并行开发。可以隐藏各自的实现细节,各自造各自的轮子,造整车的管造整车,从而较易实现系统集成。

对上述代码稍作总结,对一个使用该模块的程序员而言来看模块,就是下面这样一个视图:

static在函数内

#include 
int fun1() 

   int count = 0
   count++; 
   return count; 


int fun2() 

   static int count = 0
   count++; 
   return count; 


int main() 

   printf("fun1=%d\n", fun1()); 
   printf("fun1=%d\n", fun1());
    
   printf("fun2=%d\n", fun2()); 
   printf("fun2=%d\n", fun2());   
   return 0
}

由于一个自动型变量,一个是静态变量,存储位置不一样,生命周期也不一样,所以运行结果也不一样。

fun1=1
fun1=1
fun2=1
fun2=2

对于把函数内部变量定义为static型,个人建议是如某特性只与函数内需求或特性相关,则可以这样使用,如果不是则不建议将过多变量定义成函数内部静态变量。当然事无绝对,这个使用起来还是很灵活的。举个栗子:

  • 比如一个函数内部某些操作,在整个程序运行生命周期,只允许运行一次,这种特性属于私有特性,个人会采用下面这种策略。
void fun()
{
     static bool called = false;
     if(!called)
     {
        called = true;
        /*应用代码A*/
        .....
     }
     
     .....
}

这样当该函数在第一次运行时,将会调用应用代码A块,然后将标志设置为true,由于该变量生命周期为整个程序的生命周期,则该函数下次进入时,将不会调用应用代码A块。当然如果把这个标志用模块静态变量或者全局变量标记从功能上是一样的,这样放入内部的好处是这种需求的scope就是该函数内部,所以作用域与待实现的需求比较好的匹配。

总结一下

由于C语言不是对象语言,如能很好利用static关键字的语言特性,也可以实现些封装属性、开放接口的对象思想。当然C语言的对象编程策略绝不仅限于这一点。如能善用一些语言特点将会使代码变得更加紧凑、优雅。本文做了些简单示例总结,当然对于软件大牛而言,则显得颇为粗浅了。

本文辛苦原创总结,如果觉得有价值也请帮忙点赞/在看/转发支持,不胜感激!

END

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭