網站首頁 編程語言 正文
01簡述
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.
這里注意兩點:
- 局部靜態量的作用于仍然有改變,仍然在數內部有效
- 局部靜態變量存儲位置變為了內存,不再存儲在棧里
作用二:在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
這樣定義的變量也稱為全局靜態變量:在全局變量之前加上關鍵字static,全局變量就被定義成為一個全局靜態變量。也就是上述作用二中提到的在模塊內(但在函數體外)聲明的靜態變量。
定義全局靜態變量的好處:
- 它的作用域只在這個文件中,不會被其他文件所訪問,修改,是一個本地的局部變量。
- 其他文件中可以使用相同名字的變量,不會發生沖突。
作用三:在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。
這樣定義的函數也成為靜態函數:在函數的返回類型前加上關鍵字static,函數就被定義成為靜態函數。
定義靜態函數的好處:
- 其他文件中可以定義相同名字的函數,不會發生沖突
- 靜態函數不能被其他文件所用。它定義一個本地的函數。
02static關鍵字作用
對于上面講到的,static
關鍵字很簡單,基本就是為了代碼模塊化。在相當一段時間內,我在工作中基本沒有用到static關鍵字,在單片機的代碼中,一般情況下一個人可以管理整個代碼工程,所以并沒有大量使用static關鍵字。的,static關鍵字很簡單,基本就是為了代碼模塊化。在相當一段時間內,我在工作中基本沒有用到static關鍵字,在單片機的代碼中,一般情況下一個人可以管理整個代碼工程,所以并沒有大量使用static
關鍵字。
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關鍵字的好處,對于函數封裝有好處,當你需要將一個功能函數封裝起來,達到直接拷貝走這個函數就能用的程度,這個時候需要一個全部變量,這個時候在函數里面定義一個靜態局部變量。
原文鏈接:https://developer.51cto.com/article/701724.html
相關推薦
- 2022-04-24 Android為View添加拖放效果的方法實例_Android
- 2022-10-08 C#中LINQ的Select與SelectMany函數使用_C#教程
- 2022-07-12 mac端口號被占用解決辦法
- 2022-07-16 BOM與DOM的進階知識
- 2023-01-05 Python?Flask?模型介紹和配置方法_python
- 2022-04-10 微信小程序canvas drawImage 圖片展示的方法
- 2022-03-07 android?studio實驗:?UI設計?ListView及事件響應_Android
- 2022-05-05 R語言因子類型的實現_R語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支