回覆列表
  • 1 # 使用者8961738459335

    C時代的時候編譯器比較簡單,是固定的編譯和連結兩個過程,編譯一次只處理一個檔案,進行預處理之後,標頭檔案會插入到這一個檔案裡,不同原始碼檔案的處理時獨立的,這樣如果標頭檔案裡面定義了一個函式的實現,編譯的時候所有引用這個標頭檔案的原始碼檔案,生成的obj裡都會有這個符號。而連結是通用的連結程式,從彙編時代就用的工具,沒有什麼高階功能,同一個符號連結時出現兩次是會報錯的。

    但是,我們又說了,每個檔案的編譯是獨立的,所以如果實現不在當前原始檔裡面,呼叫的時候編譯器就不知道這個函式的型別和簽名,沒法生成呼叫程式碼,所以必須在呼叫之前先宣告一遍。如果不把宣告寫在標頭檔案裡面,就必須在每個用到這個函式的原始檔裡都宣告一遍,很不方便,所以綜合之後的解決方案就是實現寫原始碼檔案裡面,宣告寫標頭檔案裡面。

    C++只是沿用了這個設計而已,實際上現在的C++編譯器有處理符號重複定義的能力了(例如inline函式可以定義在標頭檔案裡面,但不必真的inline,也不需要像static函式一樣每個檔案生成一個符號),但是傳統也是很重要的。

    你的另一個問題,C呼叫DLL明明就是直接引用一個頭檔案啊……如果啟用了預編譯指令,一般還可以直接在標頭檔案中指定連結一個外部庫;否則需要額外連結一個obj檔案,裡面負責載入DLL。如果用動態的方式,則需要自己呼叫相應的API去載入DLL,獲取匯出點之類。

  • 中秋節和大豐收的關聯?
  • 放了SIM卡卻顯示沒有網路連線怎麼辦?