C語言中 static 關鍵字的使用方面總結

  現在才發現自己的C語言爛得一塌糊塗,很多基本的概念與使用自己都沒有搞清,各種混淆在一起。

  • static 關鍵字用於代碼塊內部的變量聲明時

這一種在平常用的比較多,下面給出了一個代碼示例。static關鍵字修改了變量的存儲屬性,本來局部變量應該存放在運行堆棧中,每次函數調用時再自動創建,函數調用完畢再自動銷燬。但是static 將其修改成了靜態變量,其存儲在內存中了,所以就算是函數調用完畢其值一直保存,其下次調用時爲直接上次的值。但是,雖然變量爲static了,但是其變量作用域依然不會改變,依然只能函數內部才能訪問。如果不加static修飾,number每次調用都會被清0.

void add_sum(void)
{
    static int number = 0;
    number ++;
}

void main(void)
{
    add_sum();
}

 

  • static 用於定義函數或者代碼塊之外的變量聲明時

再看一些內核源碼時,經常看到很多函數前面都加上一個static修飾,開始的時候一直沒搞懂爲什麼。默認函數和代碼塊外定義的變量是都是 external(外部) 鏈接屬性的,即可以在其他.c 中可以調用。但是一旦加上了static修飾,其鏈接屬性就改爲了internal,這樣做可以防止函數或者代碼塊之外的變量被其他源文件調用。只能被本源文件調用。

以下是RT_thread內核源碼中的部分截圖。

static void _rt_timer_init(rt_timer_t timer,
                           void (*timeout)(void *parameter),
                           void      *parameter,
                           rt_tick_t  time,
                           rt_uint8_t flag)
{
  ...
}

/* the fist timer always in the last row */
static rt_tick_t rt_timer_list_next_timeout(rt_list_t timer_list[])
{
   ...
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章