C语言中static关键字作用
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 = %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_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修饰。
相关推荐
choupiaoyi 2020-07-28
郭朝 2020-06-11
fengjing81 2020-01-29
零 2020-09-18
Crazyshark 2020-09-05
弱思 2020-08-02
Jaystrong 2020-07-28
willowwgx 2020-07-27
zhaowj00 2020-07-05
D先生 2020-07-04
igogo00 2020-06-28
wzxxtt0 2020-06-25
CSSEIKOCS 2020-06-25
THEEYE 2020-06-25
程序员之怒 2020-06-23
harddays 2020-06-21
亦碎流年 2020-06-18
D先生 2020-06-16