亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

文件是怎么連起來的?

好像demo.cpp和Teacher.cpp沒有關系,為什么運行demo.cpp可以用Teacher.cpp里的定義

正在回答

3 回答

從語法上說:函數只要聲明了就可以使用(調用它),所以 cpp 文件只要 include 相應的函數頭文件(頭文件中就是函數聲明)就可以使用這個函數,并不需要知道函數的實現。


那么你是好奇“為什么代碼中沒有實現也可調用呢”? 這需要你明白什么是“編譯”和“鏈接”:

函數還是需要實現的,不過那是實現在其他 cpp 文件中的。

像這樣由多個 cpp 構成的程序,其中每個 cpp 文件都是被編譯器單獨編譯的。每一個 cpp 文件被稱為一個“編譯單元”。 注意編譯器無需得知函數實現即可編譯函數調用,它只要知道函數聲明(需要聲明只是為了進行類型檢查)。

你可以想象的到,單個 cpp 文件并不能單獨編譯成可執行程序。這些 cpp 源碼文件的編譯結果需要“整合”起來,這就是鏈接。

進行鏈接是鏈接器的工作,它會找到不同編譯單元間引用的變量和函數,處理好它們之間的訪問和調用(這些具體是如何處理的你現在不用知道),然后綜合這些結果生成最終的可執行程序。

所以就每個 cpp 來說,它確實不用管它用的函數是在哪里實現的,因為后續鏈接器會處理好這一切的。


假如某個使用的函數真的沒有被任何一個 cpp 代碼實現,那么最后鏈接器會發現它找不到這一函數的實現,就會報“未定義引用”這樣的鏈接錯誤。


其實在一開始學習時寫的那種很小的單文件程序中,你也使用了實現在其他地方的函數啊! 那些 printf 之類的庫函數就是! ? 現在你回過頭想一下:你只是 include 了相應的庫頭文件,就調用了 printf,你也沒有實現 printf,但你同樣成功調用了它! ?實際上是你的編譯環境提供了庫函數的實現代碼,最后鏈接器會負責找到標準庫的實現并整合進你的程序中。

3 回復 有任何疑惑可以回復我~
#1

瀟瀟_暮雨 提問者

謝謝你!
2017-09-24 回復 有任何疑惑可以回復我~
#2

瀟瀟_暮雨 提問者

還想問你個問題,我在慕課網的視頻上看到定義了.h文件和.cpp文件,在.cpp中引用了.h文件,但是最后老師直接在.h文件里面運行程序,這是怎么回事?
2017-09-24 回復 有任何疑惑可以回復我~
#3

onemoo 回復 瀟瀟_暮雨 提問者

不明白你說的是什么意思。 編譯出來的程序是另一個可執行文件,運行它就是運行程序。這和其他的 .h .cpp 文件都沒有關系。 那么你說的“直接在.h文件里面運行程序”是什么意思?!
2017-09-24 回復 有任何疑惑可以回復我~

源文件之間調用 ?extern 調用函數 ?,如果調用的是自己編寫的頭文件就用 ?include "調用文件";


0 回復 有任何疑惑可以回復我~
#1

瀟瀟_暮雨 提問者

但是老師上課的視頻里面并沒有
2017-09-20 回復 有任何疑惑可以回復我~

那是因為你在demo.cpp中加入了Teacher.cpp的頭文件(Teacher.h)

0 回復 有任何疑惑可以回復我~
#1

瀟瀟_暮雨 提問者

demo.cpp文件里應該并沒有加teacher.cpp吧?我看視頻上的源文件并沒有發現加了,只是這兩個文件共同引用了teacher.h。為什么運行demo.cpp時能引用teacher.cpp里的文件?
2017-09-20 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
C++遠征之封裝篇(上)
  • 參與學習       103391    人
  • 解答問題       732    個

封裝--面向對象的基石,本教程力求幫助小伙伴們即學即會

進入課程

文件是怎么連起來的?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號