日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++頭文件定義全局函數或類成員函數

作者:skysky97 更新時間: 2022-08-13 編程語言

C++頭文件定義全局函數或類成員函數

你可能很熟悉C/C++的聲明定義規則:

頭文件中聲明變量和函數,源文件中定義變量和函數。在頭文件中定義變量和函數會導致“重定義”,
因為包含該頭文件的不同元文件將創建變量或函數的多個副本,這些副本都具有"extern”的可見性,
必然會造成沖突。

上述認知在你第一次接觸到模板類時受到了沖擊:模板類的實現都在頭文件內。

接著你還接觸到了所謂的"HeaderOnly"庫,他們只包含頭文件,沒有源文件。

為什么定義可以都寫在頭文件里而沒有造成“重定義”錯誤呢?在講清楚這個問題之前,你需要回顧下
line關鍵字。

line修飾的函數稱為內聯函數,他告訴編譯器允許將函數在調用位置展開,而不使用函數調用。優點是
可以減少函數調用的開銷,副作用是會導致代碼體積增加,因為每個調用位置都會復制一遍。

事實上,現代編譯器已經十分智能,他會自動選擇是否需要將函數內聯,即使你沒有用inline修飾。反之,
即使用了inline,編譯器也不一定會內聯。既然這樣,inline關鍵字似乎可以刪掉了,之所以還保留到現在,
是因為他的附加特性“允許存在多個副本”還有用。

inline修飾的函數可以存在多個副本,所以你可以在頭文件中用inline定義一個全局函數,然后在多個源文件
中調用而不用擔心造成“重定義”錯誤,編譯器會保證他們都使用同一個定義(相同的函數地址)。甚至這些
定義可以有不同的實現,不過這屬于未定義行為,編譯器可能隨即選擇一個。

所以現在的inline關鍵字實際上起到的是類似multiple的作用。

C++中,類聲明中直接定義的成員函數,都被當從inline函數,所以不會造成“重定義”,這解釋了文章開頭的
問題。模板有一點不同,但有一點類似。模板由于存在不同的模板參數,天然存在多個不同定義,所以編譯器
負責自動選擇合適的定義,并不會認為是“重定義”。

現在,你也可以寫一個HeaderOnly的庫了:

  • 使用inline修飾全局函數。
  • 使用類成員函數。
  • 使用模板。

原文鏈接:https://blog.csdn.net/skysky97/article/details/126307636

欄目分類
最近更新