成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Include Cpp?還可以這樣?

開發 前端
前兩天突然看見部門有個項目的代碼里通篇全是#include "xxx.cpp",我表示從來沒見過這種寫法,引發了我的一些思考.

[[384761]]

本文轉載自微信公眾號「程序喵大人」,作者程序喵大人  。轉載本文請聯系程序喵大人公眾號。

前兩天突然看見部門有個項目的代碼里通篇全是#include "xxx.cpp",我表示從來沒見過這種寫法,引發了我的一些思考:

問題一:這啥玩意?

C++是一門高深莫測的語言,什么寫法都有,而且#include本質上就是復制粘貼代碼,我也不敢說別人寫的不對,可能開發者是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(); 

然后三個源文件一起編譯鏈接:

發現報錯了,的確出現了multiple definition的錯誤,確實一個函數不能有多個定義。我又改了下代碼:

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

將ddd函數改成了內聯函數,然后三個源文件一起編譯鏈接:

編譯成功且正常輸出。

我將普通函數改成成員函數又測試了一次:

代碼段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(); 

然后一起編譯鏈接:

發現成員函數這樣定義也會報錯,也會有multiple definition的錯誤,我又改了一下代碼:

  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. }; 

將函數的定義搬運到了類中,編譯鏈接:

 

程序正常運行,熟悉C++的朋友可能都知道原因,類中定義的函數就相當于是內聯函數,所以編譯鏈接不會有問題。

所以得出結論:

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

問題三:貌似平時使用的模板就多數都定義在頭文件中,這個不會導致某一函數重復定義嗎?

直接看三段代碼吧:

代碼段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; 

所有源文件編譯鏈接:

發現編譯成功且正常運行,那如果函數的定義不在類內會怎么樣呢?

  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"

程序編譯鏈接后:

編譯鏈接成功且輸出正常結果。

所以得出結論:編譯器對模板做了特殊處理,不論模板類中函數是否內聯,都可以正常鏈接。

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

大體意思如下:編譯器對模板做了特殊處理,如果函數不是內聯函數,那可以有兩種處理方式:

  1. 鏈接時隨機選擇一個定義,其它的丟棄掉
  2. 編譯器會把函數的定義單獨提出來,提到單獨一個文件中,對此文件單獨編譯,就不會出現重復定義的問題。

搞定,大家對此還有什么問題,歡迎留言!

參考資料

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

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

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

 

責任編輯:武曉燕 來源: 程序喵大人
相關推薦

2022-07-30 23:45:09

內存泄漏檢測工具工具

2021-02-01 13:35:28

微信Python技巧

2022-05-17 07:26:33

動畫CSS前端

2023-07-03 16:49:47

5G

2013-09-18 10:44:01

搜狗輸入法詞語

2012-10-12 10:13:26

eclips代碼編寫Editplus

2020-08-24 07:19:13

主鍵自增數據庫

2019-01-29 10:00:59

GitHub開源搜索

2024-06-13 08:19:08

Controller接口參數

2024-05-17 09:37:26

format屬性Spring

2023-12-11 13:57:00

RFM模型激勵機制

2020-12-28 08:36:30

C語言編程泛型

2018-06-03 09:43:47

iOSAndroid谷歌

2020-06-03 10:54:28

戴爾

2024-08-06 09:51:21

SpringHTTPJSON

2022-09-26 07:32:24

開發接口編程

2018-06-27 14:23:38

機器學習人工智能入門方法

2016-09-29 17:48:32

騰訊云語音質檢珍愛網

2011-06-16 12:08:55

筆記本體驗

2022-04-24 14:13:00

快手互聯網
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠综合久久av一区二区老牛 | 欧美精品一区二区三区蜜桃视频 | 人人cao| 国产精品久久久久久久久久久久久 | 欧美国产日韩在线观看 | 国产精品免费一区二区三区 | 亚洲国产成人精品久久 | a在线观看 | 黄色一级视频免费 | 午夜手机在线视频 | 国产成人免费视频 | 亚洲一区二区三区视频 | 日本精品久久 | 在线中文av | 成人综合视频在线 | 欧美激情一区 | 日本精品视频 | 一区二区精品视频 | 国产午夜在线观看 | 国产日韩精品在线 | 成人国产精品久久 | 午夜天堂精品久久久久 | 成人伊人 | 国产精品视频一二三区 | 欧美一级二级在线观看 | 成人性生交a做片 | 亚洲成人av | 国产高清在线精品一区二区三区 | 成人高清视频在线观看 | 成人精品一区二区 | 91精品国产综合久久久久久首页 | 亚洲狠狠 | 老牛嫩草一区二区三区av | 欧美黑人一级爽快片淫片高清 | 欧美a级成人淫片免费看 | 免费黄色在线观看 | 国产亚洲人成a在线v网站 | 亚洲精品一区二三区不卡 | 一区精品国产欧美在线 | 99在线免费观看视频 | 久久男人 |