現在才發現自己的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[])
{
...
}