加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 教程 > 正文

C语言中static关键字影响

发布时间:2021-11-12 10:48:20 所属栏目:教程 来源:互联网
导读:static修饰变量 1 在块中使用static修饰变量 它具有静态存储持续时间、块范围和无链接。 即作用域只能在块中,无法被块外的程序调用;变量在程序加载时创建,在程序终止时结束。 它只在编译时初始化一次。如果没有显式初始化,默认初始化为0. #include stdio

static修饰变量
1 在块中使用static修饰变量
 
它具有静态存储持续时间、块范围和无链接。
即作用域只能在块中,无法被块外的程序调用;变量在程序加载时创建,在程序终止时结束。
它只在编译时初始化一次。如果没有显式初始化,默认初始化为0.
#include <stdio.h>
 
void trystat(void);
 
int main(void)
{
   int count;
   for (count = 1; count <= 3; count++)
   {
           printf("Here comes iteration %d:n", count);
           trystat();
   }
   
   return 0;
}
 
 
void trystat(void)
{
   int fade = 1;
   static int stay = 1;
   
   printf("fade = %d and stay = %dn", fade++, stay++);
}
程序执行结果:
Here comes iteration 1:
fade = 1 and stay = 1
Here comes iteration 2:
fade = 1 and stay = 2
Here comes iteration 3:
fade = 1 and stay = 3
 
(1) 这里变量stay ,它从程序加载时开始存在,直到程序终止。但是它的范围仅限于trystat()函数块。只有当这个函数执行时,程序才能使用stay访问它指定的对象.
 
(2) 变量stay记得它的值增加了1,但是变量fade每次都会重新开始。这指出了初始化的不同之处:fade在trystat()每次调用都从新初始化,而stay变量只初始化一次。
 
(3) 静态变量在程序加载到内存之后就已经就位了。将语句static int stay = 1;放在trystat()函数中告诉编译器,只允许trystat()函数查看变量;它不是在运行时执行的语句。
 
2 在任何函数外部使用static修饰变量
 
它具有静态存储时间、文件范围和内部链接。
即作用域在当前文件之中(只能被同一文件中的函数使用),无法被其他文件调用
它只在编译时初始化一次。如果没有显式初始化,默认初始化为0。
使用static修饰函数
作用域限制在当前定义的文件中使用,从而避免了多文件函数名称冲突的可能性。通常文件中不作为接口的函数,建议使用static修饰,这样避免不同文件使用相同的函数名发生冲突。
static BOOL wavTaskCreated = FALSE;
static QueueHandle_t wav_msg_queue = NULL;
static WAV_PLAY_QUEUE_t wavPlayQueue;
 
static bool wav_get_version_flag = false;
static char wav_version[32];
 
static uint8_t *Wav_GetFileName(WAV_TYPE_t wav_type)
{
 
}
 
 
static bool Wav_GetFileInfo(WAV_FILE_INFO_t *pFileInfo, uint8_t *pFileName)
{
  
}
 
 
static bool Wav_GetVersion_Internal(WAV_FILE_INFO_t *pFileInfo)
{
 
}
 
 
static bool Wav_ReadFile(uint8_t *pData, uint32_t offset, uint32_t size)
{
 
}
 
 
static bool Wav_SendToDA(uint8_t *pFile, uint32_t size,  uint32_t volume)
{
 
}
 
 
static BOOL Wav_Put_Queue(WAV_TYPE_t wav_type, BOOL fromISR)
{
 
}
 
 
static BOOL Wav_Get_Queue(WAV_TYPE_t *pWavType)
{
 
}
 
 
static bool Wav_Play_Inernal(WAV_TYPE_t wav_type)
{
 
}
 
 
void Wav_Init(void)
{
    DA_Init(16000);
 
    if (!wavTaskCreated)
    {
        wavTaskCreated = TRUE;
        xTaskCreate(wav_task, "WAV", STACK_SIZE_TASK_WAV, NULL, PRIORITY_TASK_WAV, NULL);
        wav_msg_queue = xQueueCreate(WAV_MSG_QUEUE_LENGTH, sizeof(WAV_MESSAGE_t));
 
        wavPlayQueue.pWavTypeTable = malloc(WAV_PALY_QUEUE_MAX * sizeof(WAV_TYPE_t));
    }
 
    wavPlayQueue.front = 0;
    wavPlayQueue.end = 0;
    wavPlayQueue.sizeNow = 0;
    wavPlayQueue.totalSize = WAV_PALY_QUEUE_MAX;
}
 
 
bool Wav_Play(WAV_TYPE_t wav_type, bool force)
{
    if (!wavTaskCreated)
    {
        return false;
    }
 
    if (force)
    {
        vPortEnterCritical();
 
        watchdog_feed();
        
        Wav_Play_Inernal(wav_type);
        
        vPortExitCritical();
 
        return true;
    }
    
    bool rv = Wav_Put_Queue(wav_type, false);
 
    vTaskDelay(30);
 
    return rv;
        
}
上述为某平台使用DA播放wav的程序片段,
 
static uint8_t *Wav_GetFileName(WAV_TYPE_t wav_type);
static bool Wav_GetFileInfo(WAV_FILE_INFO_t *pFileInfo, uint8_t *pFileName);
static bool Wav_GetVersion_Internal(WAV_FILE_INFO_t *pFileInfo);
static bool Wav_ReadFile(uint8_t *pData, uint32_t offset, uint32_t size);
static bool Wav_SendToDA(uint8_t *pFile, uint32_t size,  uint32_t volume);
static BOOL Wav_Put_Queue(WAV_TYPE_t wav_type, BOOL fromISR);
static BOOL Wav_Get_Queue(WAV_TYPE_t *pWavType);
static bool Wav_Play_Inernal(WAV_TYPE_t wav_type);
上述函数为内部函数使用static修饰。
 
void Wav_Init(void);
bool Wav_Play(WAV_TYPE_t wav_type, bool force);
上述两个函数为模块接口(初始化DA和播放wav功能)供外部调用,没有使用static修饰。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读