一、C++ 聯(lián)編概念
1、聯(lián)編引入
" 聯(lián)編 " Linkage 指的是 將 程序模塊 和 代碼 互相關(guān)聯(lián)的過程 , 將不同源文件中的 同名函數(shù) 或 變量 進(jìn)行鏈接 ;
在 C++ 語言中 , 每個(gè) 函數(shù) 或 變量 都有一個(gè) 鏈接屬性 , 該鏈接屬性決定了該 函數(shù) 或 變量 是否可以在其他源文件中使用 ;
聯(lián)編 是通過 聲明函數(shù)或變量 的 鏈接屬性 進(jìn)行控制 ;
- 如果一個(gè) 函數(shù)或變量 具有外部鏈接屬性 , 則可以在其他源文件中使用該函數(shù)或變量 ;
- 如果一個(gè) 函數(shù)或變量 具有內(nèi)部鏈接屬性 , 則只能在其所在的源文件中使用該函數(shù)或變量。
2、鏈接屬性 ( 內(nèi)部鏈接 | 外部鏈接 )
C++ 中的 鏈接屬性 有兩種 : 內(nèi)部鏈接 和 外部鏈接 ;
- 內(nèi)部鏈接 : 使用 static 關(guān)鍵字 聲明 函數(shù) 或 變量 , 該 函數(shù) 或 變量 就具有了 內(nèi)部鏈接 屬性 ; 具有 內(nèi)部鏈接 屬性的函數(shù)或變量 只能在其所在的源文件中使用 , 不能在其他源文件中使用 ;
- 外部鏈接 : 沒有使用 static 關(guān)鍵字 聲明 函數(shù) 或 變量 , 該 函數(shù)或變量 就具有了 外部鏈接 屬性 ; 具有 外部鏈接 屬性的函數(shù)或變量 可以在其他源文件中使用 , 使用前需要再這些源文件中聲明 函數(shù)或 變量 ;
3、聯(lián)編 ( C++ 語言 ) 與 鏈接 ( C 語言 )
C++中的 聯(lián)編概念 與 C 語言中的 鏈接概念 :
- 鏈接 : 在 C 語言中 , 鏈接 是指在 編譯時(shí)將不同源文件中的函數(shù)和變量鏈接在一起的過程 , 具體指的是 將 二進(jìn)制的 .o 機(jī)器碼文件 , 與 .a 靜態(tài)庫 或 .so 動(dòng)態(tài)庫 , 拼裝成可執(zhí)行文件 ;
- 聯(lián)編 : 在 C++ 中 , 聯(lián)編 是在編譯時(shí)進(jìn)行的 , 即使函數(shù)或變量的鏈接屬性為外部鏈接 , 也需要在其他源文件中進(jìn)行聲明才能使用 ;
C 語言編譯過程 參考 【C 語言】編譯過程 分析 ( 預(yù)處理 | 編譯 | 匯編 | 鏈接 | 宏定義 | 條件編譯 | 編譯器指示字 ) 博客 ;
鏈接操作 是 將 二進(jìn)制的 .o 機(jī)器碼文件 , 與 .a 靜態(tài)庫 或 .so 動(dòng)態(tài)庫 , 拼裝成可執(zhí)行文件 ;
4、靜態(tài)聯(lián)編
靜態(tài)聯(lián)編 是指在 編譯時(shí) 確定的 變量 和 函數(shù) 的 鏈接關(guān)系 ,
由 編譯器 根據(jù) 函數(shù)和變量的聲明 以及它們所在的 源文件 來確定它們之間的 鏈接關(guān)系 ;
在 C++ 語言中 , 所有的 函數(shù)和變量 默認(rèn)都具有 外部鏈接 屬性 ,
因此 , 只要在 不同的源文件 中 聲明了相同的函數(shù)或變量名 , 就可以在 鏈接 時(shí)將它們 鏈接 在一起 ;
5、動(dòng)態(tài)聯(lián)編
" 動(dòng)態(tài)聯(lián)編 " 是指在 運(yùn)行時(shí) 確定的 鏈接關(guān)系 , 它是由 程序 在 運(yùn)行時(shí) 根據(jù)需要 動(dòng)態(tài)地 加載和鏈接 不同的模塊 ;
C++ 語言中 沒有 直接支持 動(dòng)態(tài)聯(lián)編 的特性 , 但可以使用 動(dòng)態(tài)庫 技術(shù)來實(shí)現(xiàn)動(dòng)態(tài)鏈接 ;
進(jìn)行 動(dòng)態(tài)鏈接 時(shí) , 使用 外部鏈接 屬性的 函數(shù)或變量名 來 鏈接 不同的模塊 ;
靜態(tài)聯(lián)編 和 動(dòng)態(tài)聯(lián)編 是兩種不同的鏈接方式 , 其 鏈接時(shí)間 和 鏈接方式 都不同 ;
- 靜態(tài)聯(lián)編 發(fā)生在 編譯時(shí) ;
- 動(dòng)態(tài)聯(lián)編 發(fā)生在 運(yùn)行時(shí) ;
二、多態(tài)實(shí)現(xiàn)原理 - 聯(lián)編 與 virtual 關(guān)鍵字
如果 函數(shù)前 不使用 virtual 關(guān)鍵字 修飾 , 就是 靜態(tài)聯(lián)編 ;
也就是 該 不使用 virtual 關(guān)鍵字 修飾的 函數(shù), 在 編譯器 編譯階段 , 就已經(jīng)確定了 , 如何執(zhí)行該函數(shù) , 之后就無法修改了 ;
在 " 多態(tài) " 中 , 如果 使用 virtual 關(guān)鍵字 修飾 函數(shù) , 該函數(shù)就是 動(dòng)態(tài)聯(lián)編 ;
在 編譯時(shí) , 不確定 執(zhí)行 哪個(gè)函數(shù) ,文章來源:http://www.zghlxwxcb.cn/news/detail-743445.html
在 運(yùn)行時(shí) , 才確定 要執(zhí)行 哪個(gè) 函數(shù) ;文章來源地址http://www.zghlxwxcb.cn/news/detail-743445.html
到了這里,關(guān)于【C++】多態(tài) ④ ( 多態(tài)實(shí)現(xiàn)原理 | C++ 聯(lián)編概念 | 鏈接屬性 | 內(nèi)部鏈接 | 外部鏈接 | 聯(lián)編與鏈接 | 靜態(tài)聯(lián)編 | 動(dòng)態(tài)聯(lián)編 | 聯(lián)編 與 virtual 關(guān)鍵字 )的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!