【VS开发】static、extern分析总结
引用請注明出處:http://blog.csdn.net/int64ago/article/details/7396325
?????? 對于寫了很多小程序的人,可能static和extern都用的很少,因為static和extern通常在工程量很大時候才能體現優勢很必要性,這就不奇怪linux內核代碼中“泛濫”著這兩個關鍵詞,而且據我所知,這也是面試經常被問道的,因為這涉及到的底層多一點。下面,就我自己總結的幾點簡要談談:
一、c語言內存空間布局
????? 下面是google上找的一張c內存布局圖,我先基于這張圖介紹下各個內存區域的情況
1、正文(代碼段):每個程序開始前,都有系統加載代碼指令到這里,用于執行,當然都是機器碼
2、初始化的數據段:存放已經初始化的非自動變量,如全局變量int i=0;等等
3、未初始化的數據段(BSS):存放未初始化的非自動變量,如全局變量int i;等等
4、堆:動態申請的區域,如malloc、calloc、realloc等產生的
5、棧:自動變量或函數調用信息保存的區域,如局部變量int i;等等
二、extern關鍵詞
????? 這個關鍵詞是用來申明時告訴編譯器,這個變量或函數等可以在別的文件里定義,而且可以申明多次,但是定義只能一次。這樣的好處就是多個文件可以共用一個量。這里要強調一點,我想不明白為什么這么多人理解錯了,就是:用#include進來的文件和本文件不算兩個文件,因為include預處理的時候就把代碼直接加進來了,所以還是一個文件,即使你在一個文件里申明一個變量前加了static(見下面詳細說明),然后用include包含進來,在本文件也是可以用的!我所說的extern可以使變量在不同文件共享,兩者沒有什么包含關系,是獨立的,可以共用變量是靠編譯器鏈接功能實現的。繼續,當然,不是所有的全局都要extern修飾,函數申明的時候自動是extern的,這點也要注意。
三、static關鍵詞
????? 這個關鍵詞是靜態的意思,顧名思義,其實這根extern感覺就是水火兩重天了,它修飾變量只能在本文件可用,而且是靜態的,不會因為作用域的結束而消亡(但是只能在作用域內用哈~,也就是static不改變變量的作用域)。這就帶來了些好處,如果兩個文件用了相同的變量名的變量或者函數名一樣的函數,只要加了static就不會沖突;局部變量加了static還有個常用的功能就是函數調用次數的計數。關于static我在另一篇文章中也提到了,可以看看:用GCC輸出帶源代碼的匯編程序進行鏈接的調試
???? 最后,extern和static變量都是放在2、3所表示的區域,兩者還有個區別就是static你只能申明一次,為什么?很顯然,因為由它修飾的變量只能在本文件使用,故你如果申明時不初始化它自己會初始化自己為0,所以通常申明static時很多時候沒有認為初始化。可能還有人認為我說漏了auto和regester兩個修飾詞,這兩個通常有編譯器自動識別,編譯器至少這這一方面干的比你出色~
轉載于:https://www.cnblogs.com/huty/p/8518529.html
總結
以上是生活随笔為你收集整理的【VS开发】static、extern分析总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于NPN和PNP传感器的应用区别(转载
- 下一篇: I2C总线之(一)---概述