C語言中staic關鍵字很簡單,簡單到你的任何一個專案中可以不寫一個staic關鍵字也是沒有問題的,寫這篇章主要是一下自己的staic的理解和應用,當然在章開頭依舊要照本宣科簡述一下static關鍵字,
1、簡述
static關鍵字在嵌入式C語言當中很簡單,它有三個作用:
作用一:在函式體,一個被宣告為靜態的變數在這一函式被呼叫程序中維持其值不變,
void test1(void) { unsigned char a; static unsigned char b; … a++; b++; }
在這個例子中,變數a是區域變數,變數b為區域靜態變數,作用一說明了區域靜態變數b的特性:在函式體,一個被宣告為靜態的變數(也就是區域靜態變數)在這一函式被呼叫程序中維持其值不變,這個時候作用和全域變數是同的,
下面簡單的例子,宣告函式的一個區域變數,并設為static型別,作為一個計數器,這樣函式每次被呼叫的時候就可以進行計數,這個統計的方法是很好的,因為其他函式能修改這個變數(程式跑飛除外),
void count(); int main() { int i; for (i = 1; i <= 3; i++) { count(); { return 0; } void count() { static num = 0; num++; printf(" I have been called %d",num,"times/n"); }
輸出結果為:
I have been called 1 times. I have been called 2 times. I have been called 3 times.
這里注意兩點:
區域靜態量的作用于仍然有改變,仍然在數內部有效
區域靜態變數存盤位置變為了記憶體,不再存盤在堆疊里
關于區域靜態變數存盤的問題,不太懂的同學移步之前章《C語言在STM32中的記憶體分配》,
作用二:在模塊內(但在函式體外),一個被宣告為靜態的變數可以被模塊內所用函式訪問,但不能被模塊外其它函式訪問,它是一個本地的全域變數,
這樣定義的變數也稱為全域靜態變數:在全域變數之前加上關鍵字static,全域變數就被定義成為一個全域靜態變數,也就是上述作用二中提到的在模塊內(但在函式體外)宣告的靜態變數,
定義全域靜態變數的好處:
它的作用域只在這個檔案中,不會被其他檔案所訪問,修改,是一個本地的區域變數,
其他檔案中可以使用相同名字的變數,不會發生沖突,
作用三:在模塊內,一個被宣告為靜態的函式只可被這一模塊內的其它函式呼叫,那就是,這個函式被限制在宣告它的模塊的本地范圍內使用,
這樣定義的函式也成為靜態函式:在函式的回傳型別前加上關鍵字static,函式就被定義成為靜態函式,
定義靜態函式的好處:
其他檔案中可以定義相同名字的函式,不會發生沖突
靜態函式不能被其他檔案所用,它定義一個本地的函式,
2、多聊一些
對于上面講到的,static關鍵字很簡單,基本就是為了代碼模塊化,在相當一段時間內,我在作業用基本沒有用到static關鍵字,在單片機的代碼中,一般情況下一個人可以管理整個代碼工程,所以并沒有大量使用static關鍵字,
在之前的文章《STM32“隱藏的定時器”-DWT》測量代碼運行時間的代碼如下:
float DTW_Time_Difference_ms(void) { static uint32_t old_counter; uint32_t counter,couter_current; couter_current = DWT_TS_GET(); if(couter_current > old_counter) counter = couter_current - old_counter; else counter = couter_current + 0XFFFFFFFF - old_counter; old_counter = couter_current; return (counter / (SystemCoreClock/1000)); }
用到了static關鍵字,我也體會到了使用static關鍵字的好處,對于函式封裝有好處,當你需要將一個功能函式封裝起來,達到直接拷貝走這個函式就能用的程度,這個時候需要一個全部變數,這個時候在函式里面一個靜態區域變數,
各位讀文章的大佬,如果有static關鍵字的妙用,歡迎在評論區留言!
點擊查看本文所在的專輯:C語言進階
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/428426.html
標籤:嵌入式
