C++儲存修飾符解釋 (轉)
C++修飾符解釋(純理論部分)
在C++中,儲存空間主要是指變數或者或者類(下文中為了方便都稱為識別符號)的可見性和使用範圍。為此C++提供下面幾個儲存空間修飾(storageclassspecifiers),這些修飾符告訴識別符號的生存週期和可見性(可以理解為可引用性),以及這些識別符號是應該如何被儲存。
生存空間修飾符:
auto
register
static
extern
本文分成幾個部分,每一個部分相對獨立。
//////////////////////////////////////
// 連結(Linkage) //
//////////////////////////////////////
[重要]定義一個識別符號是如何被引用的
這裡我首先解釋一下連結的概念。這個概念對於我們理解本文中的一些其他的概念有著很重要的影響作用。連結是指宣告在不同生存空間的識別符號或者是在同一個生存空間中宣告多次的識別符號實際上都指向一個共同的空間(比如變數或者函式)。連結(Linkage)定義了一個識別符號在中不同部分的是否可以引用(也就是是否"可見")。
c++中連結可以分成三類:
internal,
external,
以及
no linkage.
///////////////////////////
// Internal Linkage
///////////////////////////
在生存空間(file
pe)中用static儲存修飾符來宣告識別符號(變數或者函式)的話,
我們就說這個識別符號是internal linkage。
否則的話,我們則說這個識別符號是external linkage。
///////////////////////////
// External Linkage
///////////////////////////
在檔案生存空間(file
scope)中用我們沒有使用任何儲存修飾符來宣告識別符號(變數或者函式)的話,
我們就說這個識別符號是external
linkage。雖然來講我們應該顯式使用儲存修飾符extern來宣告external linkage
標誌符的,但是因為預設的情況就是external
linkage,所以我們可以不顯式的提供extern修飾符。
///////////////////////////
// No Linkage
///////////////////////////
如果識別符號宣告在一個區塊(block)中,同時又沒有extern 儲存修飾符修飾,
我們就說這個識別符號是no linkage,同時這個識別符號只對這個區塊是可見的。
////////////////////////////////////////
// 生存空間與可見性 //
// (Scope and Visibility ) //
////////////////////////////////////////
[重要]定義變數在放在程式檔案的那個部分
在進行下面的內容之前我先講個實際上存在的現象。浩瀚的宇宙對於我們每個人來說都是那樣的神秘,我們可以說那些東西對於我們生存在地球上人都是共有的,哈哈。至少我們在心裡可以這樣認為的。因為物體客觀的存在在那裡,不屬於任何個人和團體的。但是我們說這些話有意義嗎?其實一點意義都沒有,只是我講的一個現象而已拉。哈哈好下面把這個話題再擴充一下,對於浩瀚宇宙中的物體雖然不屬於任何個人和團體,但是是每個人都可以取用嗎?一個很簡單的例子你去過月球嗎?沒有吧!!但是有些人卻去過的,因為他們有著更好的工具條件(可以認為他們有更高的)。好拉,說現象就說到這裡,
下面正式開始我們的話題。
識別符號的"可見性"決定了我們可以在程式的哪些部分可以引用。當你的程式碼處於識別符號生存空間的範圍內,你可以引用識別符號,否則你不可能引用到識別符號。生存空間可以大概分成四類:
function scope,file scope,block scope和function scope;
下面逐個解釋一下生存空間與識別符號可見性的關係:
※File scope
file scope識別符號經常也被稱“global” 或者
“external”識別符號。識別符號生存週期是從識別符號
定義或者宣告點開始一直到檔案結束。
※Function scope
※Block scope
※Function-prototype scope
這三種生存空間很相似,這裡不在表述。
這樣我要用到我講的那個現象了,因為出現了緊急狀況。
生存空間只是可見性的必要條件但是絕對不是充分條件,現在開始分析一下file scope中涉及到的具體問題。我們是識別符號是file scope是否意味著在程式中任何地方都可以引用識別符號呢,實踐的證明不是這樣的,那現在弄清楚原因就是我們的目標。不錯,在filescope中聲名或者定義的識別符號是"global"或者是"external"的,這個這是意味著這些識別符號編譯時候會被放在程式的資料段(.data segment)中,但是程式中其他部分能否引用這樣的識別符號就得看自己的本事了。這個本事跟linkage有關了,你現在要是還沒有弄清楚linkage的話,現在回頭再看看。這個就是識別符號的可見性。
哈哈到這裡你結合我前面講的那個現象可以先靜下心來想一想。
實際上在全域性生存空間定義的變數和函式如果被加上了static儲存識別符號的話,他們僅僅在定義他們的原始檔中是"可見"的。而其他的在全域性生存空間中定義的變數和函式才是真正全域性
“可見”的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1006224/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++儲存修飾符解釋 zosatapo(原作) (轉)C++
- [補充]C++儲存修飾符--生存空間詳細解釋 (轉)C++
- C++函式修飾符總結C++函式
- C++繼承時的修飾符C++繼承
- C++學習——訪問修飾符C++
- Vue - 按鍵修飾符 && 系統修飾符Vue
- Vue事件修飾符詳解Vue事件
- Java 修飾符Java 修飾符
- java修飾符Java
- 關於Java中各種修飾符與訪問修飾符的說明 (轉)Java
- 開心檔之C++ 修飾符型別C++型別
- vue 事件修飾符Vue事件
- vue sync 修飾符Vue
- 繼承&修飾符繼承
- iOS __block修飾符iOSBloC
- Java 常用修飾符Java
- 訪問修飾符
- java中的修飾符Java
- Java的static修飾符Java
- 許可權修飾符
- PHP正規表示式模式修飾符詳解PHP模式
- TypeScript 類訪問修飾符TypeScript
- Java的訪問修飾符Java
- java修飾符使用指南Java
- Java的“友好的”訪問指示符(修飾符)Java
- v-on 及其事件修飾符事件
- 從實踐認識修飾符
- Kotlin可見性修飾符Kotlin
- java oop 修飾符&關鍵字JavaOOP
- 正規表示式模式修飾符模式
- MongoDB ( 四 )高階_find修飾符MongoDB
- Java 修飾符順序問題Java 修飾符
- Vue的.sync修飾符的使用Vue
- Java修飾符關鍵詞大全Java
- Java中的native修飾符Java
- c#之tcbs extern修飾符C#
- java static修飾符的問題Java
- solidity 引用型別修飾符memory、calldata與storage 常量修飾符Constant與Immutable區別Solid型別LDA