關鍵字的使用

1.static

三類用法,全局變量,局部變量,函數
靜態全局變量:靜態全局變量和其他的全局變量的存儲地點並沒有區別,都是在.data段(已初始化)或者.bss段(未初始化)內,但是它只在定義它的源文件內有效,其他源文件無法訪問它

靜態局部變量:它與普通的局部變量比起來有如下幾個區別:
1)位置:靜態局部變量被編譯器放在全局存儲區.data(注意:不在.bss段內,原因見3)),所以它雖然是局部的,但是在程序的整個生命週期中存在
2)訪問權限:靜態局部變量只能被其作用域內的變量或函數訪問。也就是說雖然它會在程序的整個生命週期中存在,由於它是static的,它不能被其他的函數和源文件訪問
3)值:靜態局部變量如果沒有被用戶初始化,則會被編譯器自動賦值爲0,以後每次調用靜態局部變量的時候都用上次調用後的值。這個比較好理解,每次函數調用靜態局部變量的時候都修改它然後離開,下次讀的時候從全局存儲區讀出的靜態局部變量就是上次修改後的值。

static函數: 當你的程序中有很多個源文件的時候,你肯定會讓某個源文件只提供一些外界需要的接口,其他的函數可能是爲了實現這些接口而編寫,這些其他的函數你可能並不希望被外界(非本源文件)所看到,這時候就可以用static修飾這些“其他的函數”。
所以static函數的作用域是本源文件,把它想象爲面向對象中的private函數就可以了。static函數可以很好地解決不同原文件中函數同名的問題,因爲一個源文件對於其他源文件中的static函數是不可見的。
摘自:https://blog.csdn.net/keyeagle/article/details/6708077

2.const

主要作用在:全局變量,局部變量,函數參數等
所修飾的變量不能直接做左值,否則編譯器會報錯。
在函數參數聲明中const一般用來聲明指針而不是變量本身。
const 的好處,是引入了常量的概念,讓我們不要去修改不該修改的內存。直接的作用就是讓更多的邏輯錯誤在編譯期被發現。所以我們要盡能的多使用const。
摘自:https://blog.csdn.net/itxiebo/article/details/51206641#t2

3.volatile

1> 編譯器的優化
在本次線程內, 當讀取一個變量時,爲提高存取速度,編譯器優化時有時會先把變量讀取到一個寄存器中;以後,再取變量值時,就直接從寄存器中取值;當變量值在本線程裏改變時,會同時把變量的新值copy到該寄存器中,以便保持一致。
當變量在因別的線程等而改變了值,該寄存器的值不會相應改變,從而造成應用程序讀取的值和實際的變量值不一致。
當該寄存器在因別的線程等而改變了值,原變量的值不會改變,從而造成應用程序讀取的值和實際的變量值不一致。

2>volatile應該解釋爲“直接存取原始內存地址”比較合適,“易變的”這種解釋簡直有點誤導人。
摘自:https://www.cnblogs.com/reality-soul/p/6140192.html

4.extern

對變量而言,變量的聲明有兩種情況: 一種是需要建立存儲空間的,不用加extern;2、另一種是不需要建立存儲空間,需要加extern 。如果你想在本源文件中使用另一個源文件的變量,就需要在使用前用extern聲明該變量,或者在頭文件中用extern聲明該變量。

全局變量在外部使用聲明時,extern關鍵詞是必須的,如果變量無extern修飾且沒有顯式的初始化,同樣成爲變量的定義,因此此時必須加extern,而編譯器在此標記存儲空間在執行時加載如內存並初始化爲0。

局部變量的聲明不能有extern的修飾,且局部變量在運行時纔在堆棧部分分配內存。

對函數而言,如果你想在本源文件中使用另一個源文件的函數,就需要在使用前用聲明該函數,聲明函數加不加extern都沒關係,所以在頭文件中函數可以不用加extern。
謹記:聲明可以多次,定義只能一次。
摘自:https://blog.csdn.net/CSDNwei/article/details/51836182

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章