首先翻看12.1.1-12.1.11節, 弄懂相應術語和規則
以及略懂c的預處理編譯鏈結的全過程
然後個人總結理解多檔案:
檔案a要使用檔案b中實現的變數/函式:
1. 檔案a中有相應函式的宣告 (extern引用式宣告, 由於函式宣告預設是extern的, 所以不用相應關鍵字)
2. 鏈結時會在所有obj檔案中尋找變數的定義 / 函式的實現(定義)
在編譯時,編譯器只檢測程式語法,和函式、變數是否被宣告。如果函式未被宣告,編譯器會給出乙個警告,但可以生成object file。而在鏈結程式時,鏈結器會在所有的object file中找尋函式的實現,如果找不到,那到就會報鏈結錯誤碼(linker error)所以, 標頭檔案只是將檔案a中的宣告和檔案b中的宣告統一組織 (比方說檔案b實現時需用到檔案c, 但其實檔案a是無需引用檔案c的, 此時該#include還是寫在檔案b中) 上述檔案均指.c檔案
這就是為啥要將函式/結構體的宣告寫到頭檔案中 分別在實現的檔案(檔案b) 和 使用的檔案(檔案a)中分別#include了
其次, 外部鏈結的靜態變數不應該寫在標頭檔案中 (會因為上述習慣多次定義), 而應該在使用時extern宣告.
所以, 簡單的多檔案可以直接用在使用的檔案中直接 外部宣告+gcc a.c b.c -o test 的方式來產生執行檔案test
ref: 看完以下你就會回憶起來所有的想法了
1. 2.
3. 4.
1. 2.
(c c )如何編譯簡單編譯多檔案
編譯程式編譯到一定 量時,就會需要將乙個檔案分為多個檔案進行編譯,每個檔案還會對應不同的標頭檔案,這時如果使用多檔案編譯很可能會出現重複定義的問題。問題主要 於兩個方面,一方面是引用標頭檔案時,因為引用的標頭檔案裡還引用其他檔案 另一方面是標頭檔案裡定義了變數,編譯多檔案時都引用了該檔案時就會出現重...
C C 多檔案之間的變數定義
3種鏈結屬性 外部 external 內部 internal 無設定 none 外部 external 使用extern關鍵字 內部 internal 使用static關鍵字 如果在不同的檔案中定義相同名字的變數,編譯器無法通過編譯 使用extern可以訪問其他檔案中定義的變數 使用static標示...
使用C C 解析json檔案
舉個例子,我們在使用c c 進行深度學習模型的測試,由於測試過程中可能有許多引數要傳給model,比如在進行目標檢測時,要傳入nms閾值等。我們要最優化測試結果,這類引數需要不斷的調整,如果我們把這類引數的值寫在c c 中,每次修改都要重新進行make,這樣十分麻煩。我們可以將這些引數寫在乙個jso...