1. 程式人生 > >C語言中多個檔案組織(include)的原理

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檔案也是什麼 .怎麼找的只有問微軟了。