自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Include Cpp?還可以這樣?

開(kāi)發(fā) 前端
前兩天突然看見(jiàn)部門有個(gè)項(xiàng)目的代碼里通篇全是#include "xxx.cpp",我表示從來(lái)沒(méi)見(jiàn)過(guò)這種寫法,引發(fā)了我的一些思考.

[[384761]]

本文轉(zhuǎn)載自微信公眾號(hào)「程序喵大人」,作者程序喵大人  。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序喵大人公眾號(hào)。

前兩天突然看見(jiàn)部門有個(gè)項(xiàng)目的代碼里通篇全是#include "xxx.cpp",我表示從來(lái)沒(méi)見(jiàn)過(guò)這種寫法,引發(fā)了我的一些思考:

問(wèn)題一:這啥玩意?

C++是一門高深莫測(cè)的語(yǔ)言,什么寫法都有,而且#include本質(zhì)上就是復(fù)制粘貼代碼,我也不敢說(shuō)別人寫的不對(duì),可能開(kāi)發(fā)者是C++大佬,寫了一些我們普通人無(wú)法理解的代碼也是正常的。

問(wèn)題二:整個(gè)項(xiàng)目都是這種引用方式,不會(huì)導(dǎo)致某一函數(shù)重復(fù)定義嗎?

為此我查了一些資料,并做了一些測(cè)試:

代碼段1:

  1. // file1.cc 
  2. #include <iostream> 
  3.  
  4. using std::cout; 
  5.  
  6.  void ddd() { cout << "ddd \n"; } 

代碼段2:

  1. // file2.cc 
  2. #include "file1.cc" 
  3.  
  4. int main() { 
  5.     ddd(); 
  6.     return 0; 

代碼段3:

  1. // filec.cc 
  2. #include "file1.cc" 
  3.  
  4. void f() { 
  5.     ddd(); 

然后三個(gè)源文件一起編譯鏈接:

發(fā)現(xiàn)報(bào)錯(cuò)了,的確出現(xiàn)了multiple definition的錯(cuò)誤,確實(shí)一個(gè)函數(shù)不能有多個(gè)定義。我又改了下代碼:

  1. // file1.cc 
  2. #include <iostream> 
  3.  
  4. using std::cout; 
  5.  
  6. inline void ddd() { cout << "ddd \n"; } 

將ddd函數(shù)改成了內(nèi)聯(lián)函數(shù),然后三個(gè)源文件一起編譯鏈接:

編譯成功且正常輸出。

我將普通函數(shù)改成成員函數(shù)又測(cè)試了一次:

代碼段1:

  1. file1.cc 
  2. #include <iostream> 
  3.  
  4. using std::cout; 
  5.  
  6. struct A { 
  7.     int a_; 
  8.     void func(); 
  9. }; 
  10.  
  11. void A::func() { cout << "file1.cc a " << a_ << "\n"; } 

代碼段2:

  1. // file2.cc 
  2. #include "file1.cc" 
  3.  
  4. int main() { 
  5.     A a; 
  6.     a.func(); 
  7.     return 0; 

代碼段3:

  1. // filec.cc 
  2. #include "file1.cc" 
  3.  
  4. void f() { 
  5.     A a; 
  6.     a.func(); 

然后一起編譯鏈接:

發(fā)現(xiàn)成員函數(shù)這樣定義也會(huì)報(bào)錯(cuò),也會(huì)有multiple definition的錯(cuò)誤,我又改了一下代碼:

  1. // file1.cc 
  2. #include <iostream> 
  3.  
  4. using std::cout; 
  5.  
  6. struct A { 
  7.     int a_; 
  8.     void func() { cout << "file1.cc a " << a_ << "\n"; } 
  9. }; 

將函數(shù)的定義搬運(yùn)到了類中,編譯鏈接:

 

程序正常運(yùn)行,熟悉C++的朋友可能都知道原因,類中定義的函數(shù)就相當(dāng)于是內(nèi)聯(lián)函數(shù),所以編譯鏈接不會(huì)有問(wèn)題。

所以得出結(jié)論:

  • 內(nèi)聯(lián)函數(shù)的定義可以被多個(gè)源文件引入(內(nèi)聯(lián)函數(shù)到最后其實(shí)不是個(gè)函數(shù))
  • 類的定義可以被多個(gè)源文件引入(這是必須的,要不然編譯器怎么知道類的對(duì)象布局)

問(wèn)題三:貌似平時(shí)使用的模板就多數(shù)都定義在頭文件中,這個(gè)不會(huì)導(dǎo)致某一函數(shù)重復(fù)定義嗎?

直接看三段代碼吧:

代碼段1:

  1. // temp.h 
  2. #include <iostream> 
  3.  
  4. template <typename T> 
  5. struct B { 
  6.     T a; 
  7.     void ff() { std::cout << "temph \n"; } 
  8. }; 

代碼段2:

  1. // filec.cc 
  2. #include "temp.h" 
  3.  
  4. void f() { 
  5.     B<int> a; 
  6.     a.ff(); 

代碼段3:

  1. // file2.cc 
  2. #include "temp.h" 
  3.  
  4. int main() { 
  5.     B<int> a; 
  6.     a.ff(); 
  7.     return 0; 

所有源文件編譯鏈接:

發(fā)現(xiàn)編譯成功且正常運(yùn)行,那如果函數(shù)的定義不在類內(nèi)會(huì)怎么樣呢?

  1. // temp.h 
  2. #include <iostream> 
  3.  
  4. template <typename T> 
  5. struct B { 
  6.     T a; 
  7.     void ff(); 
  8. }; 
  9.  
  10. template <typename T> 
  11. void B<T>::ff() { 
  12.     std::cout << "temph \n"

程序編譯鏈接后:

編譯鏈接成功且輸出正常結(jié)果。

所以得出結(jié)論:編譯器對(duì)模板做了特殊處理,不論模板類中函數(shù)是否內(nèi)聯(lián),都可以正常鏈接。

這個(gè)結(jié)論其實(shí)不是我得出的(所以可信),而是gnu文檔(參考資料的最后一個(gè)鏈接)寫的,上述代碼只是為了印證結(jié)論。

大體意思如下:編譯器對(duì)模板做了特殊處理,如果函數(shù)不是內(nèi)聯(lián)函數(shù),那可以有兩種處理方式:

  1. 鏈接時(shí)隨機(jī)選擇一個(gè)定義,其它的丟棄掉
  2. 編譯器會(huì)把函數(shù)的定義單獨(dú)提出來(lái),提到單獨(dú)一個(gè)文件中,對(duì)此文件單獨(dú)編譯,就不會(huì)出現(xiàn)重復(fù)定義的問(wèn)題。

搞定,大家對(duì)此還有什么問(wèn)題,歡迎留言!

參考資料

https://zybuluo.com/uuprince/note/81709

https://stackoverflow.com/questions/15866258/template-class-multiple-definition

https://gcc.gnu.org/onlinedocs/gcc/Template-Instantiation.html

 

責(zé)任編輯:武曉燕 來(lái)源: 程序喵大人
相關(guān)推薦

2022-07-30 23:45:09

內(nèi)存泄漏檢測(cè)工具工具

2021-02-01 13:35:28

微信Python技巧

2023-07-03 16:49:47

5G

2022-05-17 07:26:33

動(dòng)畫CSS前端

2013-09-18 10:44:01

搜狗輸入法詞語(yǔ)

2012-10-12 10:13:26

eclips代碼編寫Editplus

2019-01-29 10:00:59

GitHub開(kāi)源搜索

2020-08-24 07:19:13

主鍵自增數(shù)據(jù)庫(kù)

2024-06-13 08:19:08

Controller接口參數(shù)

2024-05-17 09:37:26

format屬性Spring

2023-12-11 13:57:00

RFM模型激勵(lì)機(jī)制

2020-12-28 08:36:30

C語(yǔ)言編程泛型

2018-06-03 09:43:47

iOSAndroid谷歌

2024-08-06 09:51:21

SpringHTTPJSON

2020-06-03 10:54:28

戴爾

2022-09-26 07:32:24

開(kāi)發(fā)接口編程

2018-06-27 14:23:38

機(jī)器學(xué)習(xí)人工智能入門方法

2016-09-29 17:48:32

騰訊云語(yǔ)音質(zhì)檢珍愛(ài)網(wǎng)

2011-06-16 12:08:55

筆記本體驗(yàn)

2022-04-24 14:13:00

快手互聯(lián)網(wǎng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)