打印
[技术讨论]

【C语言实战经验10】static关键字的常见用法

[复制链接]
109|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dffzh|  楼主 | 2025-7-18 08:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#申请原创#
@21小跑堂


在基于C语言的嵌入式开发中,static关键字的应用是比较多的,所谓static,翻译为静态的,主要用来修饰变量和函数,其修饰的变量存放在全局/静态存储区,可能这也是为何用static来表示此关键字的原因吧。
那具体怎么使用static呢?使用它到底有什么好处呢?我们一起来看看吧。
首先,可以使用static来声明静态局部变量。
所谓静态局部变量,也就是在函数内部用static修饰的局部变量,为了防止全局变量满天飞的情况出现,即限制变量的作用域仅在函数内部,又需要变量的生命周期延长到整个程序运行期间,此时你就可以使用static来声明一个局部变量,即为静态局部变量。
静态局部变量只需要初始化一次,下次调用函数的时候会保留上一次的值,默认初始化值为0。
其实很多时候都会用到静态局部变量,包括但不限于以下情况:
定时器中断服务程序里面需要通过累加计数来执行定时任务,这个计数值就可以加static来修饰,比如下面的每隔一定时间执行打印的代码:
void TMR3_GLOBAL_IRQHandler(void)
{
    static uint16_t printCnt = 0;  //静态局部变量,累加计数

    if(tmr_flag_get(TASK_TIMER_TYPE, TMR_OVF_FLAG) != RESET)
        {
        //set print interval
        if(++printCnt >= 5000)
                {
                        printCnt = 0;
                        debugPrintfFlag = TRUE;
                }   
        tmr_flag_clear(TASK_TIMER_TYPE, TMR_OVF_FLAG);
        }                       
}
又或者是一些需要**上一次状态的操作,比如下面的首次执行函数时需要操作一次配置的代码:
static void adc_sample(void)
{
        static uint8_t reg_config_flag = 0;

    //sample config
        if(0 == reg_config_flag)
        {
            reg_config_flag = 1;
            adc_sequence_reg_config();
        }
        //add your code
}
这里需要注意一点:
对于元素较多的数组,如果栈空间资源有限,尽量不要声明为静态局部变量,因为大数组会占用大量栈空间,容易导致溢出,此时可以将大数组定义为全局变量。
其次,可以使用static来声明静态全局变量。
所谓静态全局变量,也就是在某个源文件里声明的,其作用域仅限当前文件的全局变量。同样地,为了增加代码的可读性,可维护性和健壮性,如果某个全局变量只用在某个源文件,此时你就可以将其声明为静态全局变量,这样,当其他文件试图调用它时,程序编译则会报错。
比如某个用于存放设备配置参数的全局变量g_DeviceConfigPara是通过函数读写接口来封装和操作的,这个时候你就可以将g_DeviceConfigPara声明为静态全局变量,主要代码如下:
static uint8_t g_DeviceConfigPara = 0;

void set_device_para(uint8_t config_data)
{
    g_DeviceConfigPara = config_data;
}

uint8_t get_device_para(void)
{
    return g_DeviceConfigPara;
}
这样,其他源文件通过set_device_para和get_device_para两个函数接口来访问静态全局变量g_DeviceConfigPara就可以了,也不会出现全局变量到处飞的现象了。
最后,可以使用static来声明静态函数。
类似于静态全局变量,所谓静态函数,也就是所定义的函数的作用域仅在该源文件,其他文件无法调用此函数。当你看到某个函数的声明上加上了static,就说明该函数只用在该文件,一目了然,增加代码可读性。
以下代码展示了一个静态函数的定义和使用:
//声明一个静态函数
static void adc_sample(void)
{
        //add your code
}

//调用静态函数,外部调用adc_handle
void adc_handle(void)
{
    adc_sample();
}
以上通过代码示例的方式讲解了static关键字在C语言嵌入式开发中的三种常见应用,希望能给大家提供一些参加价值,会的朋友给帖子点个赞也可以的~~。

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

83

主题

1006

帖子

16

粉丝