static
一、概述
在c語言中static恰當的使用能讓程序更加完美,細節上的嚴謹,代碼會更好,也更利於程序的維護與擴展。
而static使用靈活,且又有兩種完全無關的用法,所以整理總結一下。
二、static的兩種用法:
1、static修飾局部變量,成為一個局部靜態變量。
2、static修飾全局變量與函數,成為靜態全局變量與靜態函數。
三、相關涉及概念
可能會疑惑,修飾全局變量與修飾函數怎么會是一個用法?
static涉及的東西也比較多,以下有幾個概念需要明白。
1、什么是存儲類
簡單的說也就是存儲類型,c中變量是在哪里存放的?內存是怎么管理的?
所以內存的管理:
①棧:局部變量,函數調用傳參的過程
②堆:動態存儲區,需要程序員去申請釋放
③數據段(data段):顯式初始化非零的全局變量(static修飾顯式初始化非0的局部變量)
④bss段:顯式初始化為0與未初始化的全局變量(static修飾顯式初始化為0與未初始化的局部變量)
⑤text段:代碼(函數)、只讀數據
2、什么是生命周期
描述變量什么時候誕生,什么時候消亡,從誕生到消亡就是這個變量的生命周期。
①局部變量(棧),生命周期即是進入函數,從變量創建到函數返回時變量死亡。
②全局變量(data/bss),生命周期是程序執行到程序結束
③堆變量,生命周期是從我們malloc到free
3、什么是作用域
描述變量的作用的代碼范圍。c的作用域規則是代碼塊作用域,即是一對花括號{}。
一般的從變量定義到{}結束,即是這個變量的作用域
全局變量與函數一般是文件作用域,即作用域是整個.c
4、什么是鏈接屬性
編譯器將很多源文件編譯成很多.o文件后,每個.o文件里有符號、代碼段、data/bss等等的分段,鏈接器需要通過符號將這些內存鏈接起來。而這些符號就是鏈接屬性。
c中有三種鏈接屬性:外鏈接、內鏈接、無鏈接屬性。
外鏈接:外部鏈接,可以在整個程序(跨文件)鏈接。
普通的函數與全局變量。
內鏈接:內部連接,只能在當前.c文件進行鏈接。
static修飾的全局變量與函數
無鏈接:沒有鏈接。
普通局部變量
四、具體分析static的兩種用法
1、static修飾局部變量(靜態局部變量)與普通局部變量相比
①靜態局部變量作用域與連接屬性與普通局部變量一樣
②存儲類:靜態局部變量分配在data/bss段,普通局部變量在棧上。
③生命周期:因為存儲類的不同,靜態局部變量的生命周期得到延長了,直到程序結束。
所以當局部靜態變量離開作用域后,並沒有銷毀,而是仍然駐留在內存當中,只不過我們不能再對它進行訪問,直到該函數再次被調用,並且值不變。
2、static修飾全局變量\函數 與 普通全局變量\普通函數相比
存儲類、生命周期、作用域都一樣
差別在於static修飾全局變量\函數連接屬性是內連接,普通全局變量\普通函數是外鏈接
就是說static修飾全局變量\函數不能跨文件訪問調用
五、補充:為什么需要這樣?
原因是命名的沖突、一個大工程不是常常不是一個人完成的,難免會遇到全局變量、函數命名一樣。為了減少這類沖突static是很有用的工具。但是很可惜並不能完全解決,所以我們應該有效的去避免減少此類情況的發生。
如果函數僅僅被同一個源文件調用時,我們就應該聲明該函數為static。
......
作者:Devil-wei
出處:https://www.cnblogs.com/Devil-wei/
版權聲明:本文版權歸作者,轉載請標注文章作者與出處