Keil 对于静态函数使用范围的作用域一点小小的研究

static意为静态的,如果在一个函数中定义了一个静态变量,第一次调用这个函数时且赋值后这个变量将会存在于内存中,该函数运行结束后,该变量不会被释放。当你再次调用该函数时,这个静态变量不会被重新建立。如果在Keil中你在一个.C文件中定义了一个带static关键字的函数或定义了一个静态的变量,其作用域只限定在该.C文件内,在其他文件内无法进行调用,即使用extern也会报错,提示你该变量未定义。(错误类型可能是 error:  #114: function "PWM_GPIO_Config" was referenced but not defined)

例如我现在有一个unit_config.c、unit_config.h、main.c三个文件

首先在unit_config.c里对静态函数进行定义

//unit_config.c
static void PWM_TIMx_Config(void)
{
    ...
}
static void PWM_GPIO_Config(void)
{
    ...
}

其次在unit_config.h内对静态函数进行声明

//unit_config.h
#ifndef __UNIT_CONFIG_H
#define __UNIT_CONFIG_H

static void PWM_GPIO_Config(void);
static void PWM_TIMx_Config(void);

#endif

在mian.c中调用这两个静态函数就会报错

//main.c
#include "stm32f10x.h"
#include "stm32f10x_it.h"
#include "stm32f10x_conf.h"

int main(void)
{
	PWM_GPIO_Config();
	PWM_TIMx_Config();
  while(1)
  {
	
		
		
  }

}

报错内容是:

error:  #114: function "PWM_GPIO_Config" was referenced but not defined

static void PWM_GPIO_Config(void);

error:  #114: function "PWM_TIMx_Config" was referenced but not defined

static void PWM_TIMx_Config(void);

为了防止这种情况发生,可以在unit_config.c和unit_config.h内稍做变化,在unit_config.c内定义一个函数,在这个函数内调用你所需要的静态函数,这两个静态函数就可以间接被main.c调用了。

//unit_config.c
void PWM_Config(void)
{
    PWM_GPIO_Config();
    PWM_TIMx_Config();
}
//unit_config.h
void PWM_Config(void);

在mian.c内调用这个函数就不会报错了。

//main.c
#include "stm32f10x.h"
#include "stm32f10x_it.h"
#include "stm32f10x_conf.h"

__IO u32 TimingCounter=0;

int main(void)
{
    PWM_Config();
    while(1)
    {
    }
}

 

 

 

 

 

 

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值