C语言中static关键字作用
static修饰变量
1 在块中使用static修饰变量
它具有静态存储持续时间、块范围和无链接。
即作用域只能在块中,无法被块外的程序调用;变量在程序加载时创建,在程序终止时结束。
它只在编译时初始化一次。如果没有显式初始化,默认初始化为0.
#include<stdio.h>
voidtrystat(void);
intmain(void)
{
intcount;
for(count =1; count <=3; count++)
{
printf("Here comes iteration %d:\n", count);
trystat();
}
return0;
}
voidtrystat(void)
{
intfade =1;
staticintstay =1;
printf("fade = %d and stay = %d\n", 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_toffset,uint32_tsize)
{
}
static boolWav_SendToDA(uint8_t*pFile,uint32_tsize,uint32_tvolume)
{
}
static BOOLWav_Put_Queue(WAV_TYPE_t wav_type, BOOL fromISR)
{
}
static BOOLWav_Get_Queue(WAV_TYPE_t *pWavType)
{
}
static bool Wav_Play_Inernal(WAV_TYPE_t wav_type)
{
}
voidWav_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;
}
boolWav_Play(WAV_TYPE_t wav_type,boolforce)
{
if (!wavTaskCreated)
{
returnfalse;
}
if(force)
{
vPortEnterCritical();
watchdog_feed();
Wav_Play_Inernal(wav_type);
vPortExitCritical();
returntrue;
}
boolrv = Wav_Put_Queue(wav_type,false);
vTaskDelay(30);returnrv;
}
上述为某平台使用DA播放wav的程序片段,
staticuint8_t *Wav_GetFileName(WAV_TYPE_t wav_type);
staticboolWav_GetFileInfo(WAV_FILE_INFO_t*pFileInfo,uint8_t*pFileName);
staticboolWav_GetVersion_Internal(WAV_FILE_INFO_t*pFileInfo);
staticboolWav_ReadFile(uint8_t*pData,uint32_toffset,uint32_tsize);
staticboolWav_SendToDA(uint8_t*pFile,uint32_tsize,uint32_tvolume);
staticBOOLWav_Put_Queue(WAV_TYPE_t wav_type, BOOL fromISR);
staticBOOLWav_Get_Queue(WAV_TYPE_t *pWavType);
staticboolWav_Play_Inernal(WAV_TYPE_t wav_type);
上述函数为内部函数使用static 修饰。
voidWav_Init(void);
boolWav_Play(WAV_TYPE_t wav_type,boolforce);
上述两个函数为模块接口(初始化DA和播放wav功能)供外部调用,没有使用static修饰。