C語言中多個文件組織(include)的原理

大學剛學C的時候,老師教的第一個C程序是打印出一個helloword字樣,並告訴我們,要使用printf這個東西,C文件開頭需要加上一句:#include"stdio.h"


這個語句是實現了什麼動作?


後來學到C++,好像老師還是同學(記不清楚了)說了一句,#include 的作用是將目標文件的內容複製到該位置


再後來,學習到函數的定義和聲音,老師教我們將函數的聲明寫在對應的.h文件中,再在對應的.c文件實現該函數的定義,我們需要用到該函數之時,只要將對應的.h文件用include語句包含進來即可。

那麼問題來了,既然include只是將目標文件的內容複製到該區域,在預處理後的主程序結構中,將只會函數的聲明包括進來,函數的具體定義呢?沒有具體的定義,是如何實現函數的調用的?


今天看到一個帖子,終於對於C語言的編譯過程有了些許瞭解,也解決了困擾我這麼久的一個問題


第一:函數沒有定義實現,編譯不會有錯但鏈接找不到實現會報錯。

第二個:需要了解exe生成的原理((預處理->編譯->彙編->鏈接);
 1:預處理,就是處理文件包含(include),宏定義等替換的動作。 這裏的#include 只是替換。
            我們看到的庫函數頭文件一般只是聲明,實現一般是生成dll文件。
 2:編譯   編譯器對源代碼進行編譯,是將以文本形式存在的源代碼翻譯爲機器語言形式的目標文件的過程
 3:鏈接   把用到的外部的地址放到exe中。

  使用動態連接編譯,比如sprintf,生成的exe中只是簡單的記錄了當前sprinf函數的地址,只有當運行需要的時候纔會到相應的dll中調用改函數的實現。
  如果使用靜態連接exe則會很大。


頭文件包含聲明,   庫文件包含實現或者與DLL庫的連接 

如果在代碼裏要用到這些函數那麼就要包含頭文件,編譯的時候才能知道函數的原形; 

在進行代碼連接的時候就需要庫文件了,這時連接器就把函數的實現代碼連接到你的程序(靜態庫)或者將你的函數調用連接到相應的DLL的對應函數(動態庫) 。
微軟一般是頭文件名字是什麼,lib文件也是什麼 .怎麼找的只有問微軟了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章