網(wǎng)站首頁 編程語言 正文
01簡述
static關(guān)鍵字在嵌入式C語言當(dāng)中很簡單,它有三個作用:
作用一:在函數(shù)體,一個被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。
void test1(void) { ? ? unsigned char a; ? ? static unsigned char b; ? ? … ? ? a++; ? ? b++; }
在這個例子中,變量a是局部變量,變量b為局部靜態(tài)變量。作用一說明了局部靜態(tài)變量b的特性:在函數(shù)體,一個被聲明為靜態(tài)的變量(也就是局部靜態(tài)變量)在這一函數(shù)被調(diào)用過程中維持其值不變。這個時(shí)候作用和全局變量是同的。
下面簡單的例子,聲明函數(shù)的一個局部變量,并設(shè)為static
類型,作為一個計(jì)數(shù)器,這樣函數(shù)每次被調(diào)用的時(shí)候就可以進(jìn)行計(jì)數(shù)。這個統(tǒng)計(jì)的方法是很好的,因?yàn)槠渌瘮?shù)能修改這個變量(程序跑飛除外)。
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"); }
輸出結(jié)果為:
I have been called 1 times.
I have been called 2 times.
I have been called 3 times.
這里注意兩點(diǎn):
- 局部靜態(tài)量的作用于仍然有改變,仍然在數(shù)內(nèi)部有效
- 局部靜態(tài)變量存儲位置變?yōu)榱藘?nèi)存,不再存儲在棧里
作用二:在模塊內(nèi)(但在函數(shù)體外),一個被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個本地的全局變量。
這樣定義的變量也稱為全局靜態(tài)變量:在全局變量之前加上關(guān)鍵字static,全局變量就被定義成為一個全局靜態(tài)變量。也就是上述作用二中提到的在模塊內(nèi)(但在函數(shù)體外)聲明的靜態(tài)變量。
定義全局靜態(tài)變量的好處:
- 它的作用域只在這個文件中,不會被其他文件所訪問,修改,是一個本地的局部變量。
- 其他文件中可以使用相同名字的變量,不會發(fā)生沖突。
作用三:在模塊內(nèi),一個被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。
這樣定義的函數(shù)也成為靜態(tài)函數(shù):在函數(shù)的返回類型前加上關(guān)鍵字static,函數(shù)就被定義成為靜態(tài)函數(shù)。
定義靜態(tài)函數(shù)的好處:
- 其他文件中可以定義相同名字的函數(shù),不會發(fā)生沖突
- 靜態(tài)函數(shù)不能被其他文件所用。它定義一個本地的函數(shù)。
02static關(guān)鍵字作用
對于上面講到的,static
關(guān)鍵字很簡單,基本就是為了代碼模塊化。在相當(dāng)一段時(shí)間內(nèi),我在工作中基本沒有用到static關(guān)鍵字,在單片機(jī)的代碼中,一般情況下一個人可以管理整個代碼工程,所以并沒有大量使用static關(guān)鍵字。的,static關(guān)鍵字很簡單,基本就是為了代碼模塊化。在相當(dāng)一段時(shí)間內(nèi),我在工作中基本沒有用到static關(guān)鍵字,在單片機(jī)的代碼中,一般情況下一個人可以管理整個代碼工程,所以并沒有大量使用static
關(guān)鍵字。
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
關(guān)鍵字,我也體會到了使用static關(guān)鍵字的好處,對于函數(shù)封裝有好處,當(dāng)你需要將一個功能函數(shù)封裝起來,達(dá)到直接拷貝走這個函數(shù)就能用的程度,這個時(shí)候需要一個全部變量,這個時(shí)候在函數(shù)里面定義一個靜態(tài)局部變量。
原文鏈接:https://developer.51cto.com/article/701724.html
相關(guān)推薦
- 2022-06-01 C語言超詳細(xì)解析函數(shù)棧幀_C 語言
- 2024-03-07 MyBatis多表映射
- 2022-08-19 Go語言fsnotify接口實(shí)現(xiàn)監(jiān)測文件修改_Golang
- 2022-04-22 appium報(bào)錯:Original error: socket hang up
- 2023-12-26 Description:Web server failed to start. Port 8080
- 2022-08-01 Android開發(fā)之Flutter與webview通信橋梁實(shí)現(xiàn)_Android
- 2022-02-10 easy LESS只針對特定工程啟用
- 2022-05-16 C++Smart?Pointer?智能指針詳解_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支