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だけ増加覚え、しかし可変フェード。:これは、初期設定の違いを指摘しfadetrystat()、各コールの再初期化、および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);

これは、静的変形を使用することなく、外部コールのための2つの機能モジュールインタフェース(DA初期化機能とプレイWAV)、前記しました。

おすすめ

転載: www.cnblogs.com/sky1blue/p/11260164.html