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每次都会重新开始。这指出了初始化的不同之处:fadetrystat()每次调用都从新初始化,而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修饰。

最新文章

  1. HTTP和HTTPS
  2. angularjs(一)基础概念
  3. 【腾讯Bugly干货分享】iOS黑客技术大揭秘
  4. jQuery 3.0正式发布
  5. js的event.srcElement与event.target(触发事件对象)
  6. Visual Studio Code 怎么支持中文
  7. postgreSql基础命令及linux下postgreSql命令
  8. sql server 查看表结构说明
  9. power desinger 学习笔记&lt;八&gt;
  10. PAT 64.Complete Binary Search Tree
  11. php基础知识(有代码有注释)
  12. RAMOS系统 WIN7+VHD+GURB map
  13. python中使用selenium调用Firefox缺少geckodriver解决方法
  14. (三十二)虚拟机linux系统中安装firefox浏览器
  15. BZOJ_1042_[HAOI2008]硬币购物_容斥原理+背包
  16. MT【317】两次判别式
  17. Java异常处理设计(三)
  18. codeforces - 432D Prefixes and Suffixes (next数组)
  19. IntelliJ IDEA 中SpringBoot对Run/Debug Configurations配置 SpringBoot热部署
  20. jquery ajax跨域

热门文章

  1. Python 装饰器(Decorators) 超详细分类实例
  2. December Challenge 2019 Division 1 题解
  3. 03-树3 Tree Traversals Again (25 分)
  4. Django 数据库与ORM
  5. 【BigData】Java基础_数组
  6. UDF——查找单元的相邻单元
  7. 一种SpaceClaim抽取流道的方法——利用缺失的面功能
  8. Cisco路由器用SSH替代Telnet连接
  9. TFS变更地址
  10. 真机调试No target device的解决(android studio)3.4.1