最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++存儲鏈接性原理詳解

 更新時間:2023年01月03日 16:30:23   作者:碼小方  
這篇文章主要為大家介紹了C++存儲鏈接性原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

鏈接性

鏈接性是指名稱在不同文件之間能否共享,而作用域是指名稱在文件內(nèi)部哪些范圍可見。

這里的文件并非開發(fā)時創(chuàng)建的文件,而是將文件的 include 內(nèi)容全部遞歸包含進來之后,形成的大文件。

這一點也是與Go等一些語言不同。在Go語言中,文件是按包(package)組織,所有依賴的包都需要直接或間接import進來。也就是從main開始遞歸import得到的就是我們依賴的所有文件。

但C++不同。C++源文件主要分.h 和 .cpp兩種,一般我們都只會include .h文件,而不會include .cpp文件。因此,.cpp文件之間其實沒有直接關聯(lián),需要通過cmakelist等方式告訴編譯器,我們的程序涉及到哪些源文件。

而C++在編譯時,會首先將include的文件內(nèi)容全部遞歸包含進來,形成一個大的文件,這個大文件是一個編譯單元,也就是上面鏈接性所說的文件。其實,C++的宏定義的可使用范圍,也是在這個大文件內(nèi)。

鏈接性有三種:

  • 外部鏈接性:一個文件聲明的名稱可以在另一個文件中使用
  • 內(nèi)部鏈接性:聲明的名稱只能在文件內(nèi)使用
  • 無鏈接性:意味著只能在函數(shù)或代碼塊內(nèi)使用

自動類型變量都沒有鏈接性,而靜態(tài)類型變量可以有三種鏈接性。那么如何定義這三種鏈接性的靜態(tài)變量呢?

外部鏈接性

鏈接性為外部的變量也叫外部變量,也稱全局變量。外部變量在函數(shù)外聲明,不加static關鍵字。外部變量可以在所有文件使用。

對于函數(shù)來說,沒有加inline和static關鍵字的函數(shù),都具有外部鏈接性。

說到外部,可能會想到一個關鍵字:extern。這個關鍵字有什么用?實際上它是用來做引用聲明。因為如果想使用其他文件中定義的外部變量,不能直接使用,而是要先進行引用聲明,表示要引用這個外部變量,這里就需要用到關鍵字extern。例如:

// file1.cpp
int foo = 1;

// file2.cpp
extern int foo;
// extern int foo = 1; WRONG
cout << foo;

file1.cpp 在函數(shù)之外定義了全局變量foo,在file2.cpp中,用extern關鍵字聲明之后,即可使用foo了。注意,extern語句中不能初始化foo,否則這里就變成定義而不是引用聲明,導致重復定義全局變量foo,編譯錯誤。

單定義規(guī)則

對于外部變量,每個使用它的文件都必須聲明它。而C++又有“單定義規(guī)則”,即鏈接性為外部的函數(shù)和變量可以有多個聲明,但只能有一個定義。這里再明確下這兩個術語:“定義聲明”,簡稱“定義”;“引用聲明”,簡稱“聲明”。

為了實現(xiàn)單定義規(guī)則,編譯器要知道這一行代碼是在聲明還是在定義,那怎么區(qū)分聲明還是定義呢?

對于函數(shù)來說,區(qū)分聲明和定義很簡單,有函數(shù)體則是定義,否則為聲明。而變量則不同,前面所謂的變量聲明,對于編譯器來說都是定義,都分配了存儲空間。如何聲明一個變量而不分配存儲空間呢?關鍵字extern就派上用場了,使用extern關鍵字且沒有進行初始化,則為聲明,不會分配存儲空間,否則為定義。

C++初學者可能還不太明白為什么C++中都要把函數(shù)聲明放在.h文件,把函數(shù)定義放在.cpp文件中。其實用單定義規(guī)則就很好解釋了。函數(shù)如果沒有加inline和static,即具有外部鏈接性,如果把定義放在.h文件中,這個.h文件會被多個.cpp文件引用,編譯時會形成多個副本,相當于被定義了多次。

總之,.h文件中只能放聲明,或者沒有外部鏈接性的定義。

可能有小伙伴發(fā)現(xiàn),有些定義在函數(shù)外的靜態(tài)變量沒有加static,也會放在.h文件中,為什么可以呢?其實const變量默認會添加static,鏈接性變?yōu)閮?nèi)部。而如果想要聲明為外部變量,則需要加上external:

const int foo = 10;  // 鏈接性為內(nèi)部
extern const int bar = 10; // 鏈接性為外部

內(nèi)部鏈接性

前面說了,定義在函數(shù)外部的變量默認是全局變量,具有外部鏈接性。但如果加上static說明符,則變成內(nèi)部鏈接性。對于函數(shù)也一樣,加上static則變?yōu)閮?nèi)部鏈接性。

在函數(shù)外定義的變量,static的含義與局部變量中static的含義不同。前者表示鏈接性為內(nèi)部,后者表示存儲持續(xù)性為靜態(tài)。這也可以稱為關鍵字重載,即關鍵字在不同上下文中有不同含義。

具有內(nèi)部鏈接性的變量或函數(shù),可以在不同文件中有多個定義。內(nèi)部鏈接性的變量也可以與同名外部變量同時存在,這時內(nèi)部變量將隱藏外部變量。對函數(shù)來說也一樣。

無鏈接性

定義在函數(shù)或代碼塊內(nèi)的局部變量沒有鏈接性,只能在局部使用。如果加上static修飾則為靜態(tài)變量,雖然在程序運行期間會一直存在,但只有在代碼塊內(nèi)才能使用。

總結(jié)

下面總結(jié)一下前面提到的不同存儲持續(xù)性與鏈接性的變量。

  • 自動存儲持續(xù)性,無鏈接性

在代碼塊內(nèi)定義

  • 靜態(tài)存儲持續(xù)性,無鏈接性

在代碼塊內(nèi)定義,用static關鍵字

  • 靜態(tài)存儲持續(xù)性,內(nèi)部鏈接性

在代碼塊外定義,用static關鍵字 或const修飾

  • 靜態(tài)存儲持續(xù)性,外部鏈接性

在代碼塊外定義。引用聲明則需要用extern

以上就是C++存儲鏈接性原理示例詳解的詳細內(nèi)容,更多關于C++存儲鏈接性原理的資料請關注腳本之家其它相關文章!

相關文章

  • C++創(chuàng)建多線程的方法總結(jié)

    C++創(chuàng)建多線程的方法總結(jié)

    下個迭代有個任務很有趣,用大量的線程去訪問一個接口,直至其崩潰為止,這就需要多線程的知識,這也不是什么難事,本文總結(jié)一下C++中的多線程方法std、boost、pthread、windows?api,感興趣的朋友可以參考下
    2024-01-01
  • c++ 判斷是64位還是32位系統(tǒng)的實例

    c++ 判斷是64位還是32位系統(tǒng)的實例

    這篇文章主要介紹了c++ 判斷是64位還是32位系統(tǒng)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • c++實現(xiàn)跳躍表(Skip List)的方法示例

    c++實現(xiàn)跳躍表(Skip List)的方法示例

    跳表(skiplist)是一個非常優(yōu)秀的數(shù)據(jù)結(jié)構(gòu),實現(xiàn)簡單,插入、刪除、查找的復雜度均為O(logN),下面這篇文章主要介紹了c++實現(xiàn)跳躍表(Skip List)的相關資料,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-09-09
  • C++實現(xiàn):螺旋矩陣的實例代碼

    C++實現(xiàn):螺旋矩陣的實例代碼

    螺旋矩陣是指一個呈螺旋狀的矩陣,它的數(shù)字由第一行開 始到右邊不斷變大,向下變大, 向左變大,向上變大,如此循環(huán)。
    2013-03-03
  • opencv實現(xiàn)角點檢測

    opencv實現(xiàn)角點檢測

    這篇文章主要為大家詳細介紹了opencv實現(xiàn)角點檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++中幾種將整數(shù)轉(zhuǎn)換成二進制輸出的方法總結(jié)

    C++中幾種將整數(shù)轉(zhuǎn)換成二進制輸出的方法總結(jié)

    下面小編就為大家?guī)硪黄狢++中幾種將整數(shù)轉(zhuǎn)換成二進制輸出的方法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • C++函數(shù)指針的用法詳解

    C++函數(shù)指針的用法詳解

    這篇文章主要為大家介紹了C++函數(shù)指針的用法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

    2022-01-01
  • 深入理解約瑟夫環(huán)的數(shù)學優(yōu)化方法

    深入理解約瑟夫環(huán)的數(shù)學優(yōu)化方法

    本篇文章是對約瑟夫環(huán)的數(shù)學優(yōu)化方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++?使用getline()從文件中讀取一行字符串方法示例

    C++?使用getline()從文件中讀取一行字符串方法示例

    這篇文章主要介紹了C++?使用getline()從文件中讀取一行字符串方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • C語言實現(xiàn)掃雷游戲

    C語言實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評論

和龙市| 开化县| 崇阳县| 加查县| 新津县| 奈曼旗| 河北区| 大田县| 丽江市| 淮南市| 呼伦贝尔市| 嘉义市| 台安县| 吴桥县| 奇台县| 嘉黎县| 饶平县| 嘉鱼县| 皮山县| 吴川市| 南漳县| 卢龙县| 祁门县| 宿松县| 普格县| 藁城市| 东光县| 龙游县| 桐庐县| 宣恩县| 景谷| 吴江市| 兴文县| 怀来县| 荃湾区| 泰宁县| 祁阳县| 合肥市| 太谷县| 南岸区| 乐陵市|