C++/Linux服务器开发C语言我用 Linux

C语言中static关键字作用

2019-07-28  本文已影响0人  7ee72f98ad17

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修饰。

原文: https://www.linuxidc.com/Linux/2019-07/159635.htm

上一篇 下一篇

猜你喜欢

热点阅读