C 언어 역할의 정적 키워드

정적 변수 수정

1 변형 정적 블록 변수를 사용하여

  • 이는 정적 저장 기간, 블록 범위와 연결하지 않고있다.
    변수는 프로그램이 종료 할 때 종료 프로그램이 로딩 될 때 생성되고, 그 범위는 블록의 블록 외부에 호출 될 수 없다.
  • 그것은 단지 컴파일시에 한 번 초기화. 당신이 명시 적으로 초기화하지 않는 경우, 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++);
}

程序执行结果 :
여기서 반복되어 1 :
페이드 = 1 = 1로 유지
여기서 온다 반복 2 :
페이드 = 1 = 2를 유지
여기에서 반복되어 3 :
페이드 = 1 유지 = 3

여기서 변수가 (1) stay,이 개시로부터로드 된 프로그램이 종료 될 때까지 존재한다. 그러나,이 범위로 한정되는 trystat()기능 블록. 이 기능이 실행되는 경우에만 프로그램을 사용할 수 있습니다 stay그것은 특정 개체에 액세스 할 수 있습니다.

(2) 변수는 stay그 값이 1 씩 증가 기억하지만 페이드 변수마다 다시 시작한다. 그것은 초기화의 차이점을 지적 : fade에서 trystat()각 통화의 재 초기화를하고, stay변수는 한 번만 초기화됩니다.

제자리에 이미 후 (3) 프로그램의 정적 변수가 메모리로로드된다. static int stay = 1;trystat () 함수에 만 허용하는 컴파일러를 알려줍니다 trystat()함수가 변수를 확인할 수를, 그것은 문이 실행시 실행되지 않습니다.

도 2는 임의의 함수의 외부 정적 변수를 사용하여 수정

  • 그것은 정적 저장 시간, 파일 범위 및 내부 링크가 있습니다.
    현재 파일에서 그 범위는 (기능은 동일한 파일에 사용할 수있다), 다른 파일에 의해 호출 할 수 없습니다
  • 그것은 단지 컴파일시에 한 번 초기화. 당신이 명시 적으로 초기화하지 않는 경우, 0 기본적으로 초기화.

정적 수정 기능을 사용하여

  • 범위는 멀티 파일 함수 이름 충돌의 가능성을 방지하기 위해 파일의 사용이 현재 정의 된 제한합니다. 인터페이스의 기능, 따라서 다른 파일이 동일한 함수 이름 충돌을 사용 방지, 정전기 수정 사용을 권장하지 않는 한 일반적으로 파일.
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;
        
}

위의 사용 브로드 캐스트 WAV DA 플랫폼 프로그램 조각이다,

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 플레이)했다.

추천

출처www.linuxidc.com/Linux/2019-07/159635.htm