預編譯標頭檔案及編譯鏈結過程

2021-06-20 11:31:17 字數 1229 閱讀 6797

預編譯標頭檔案

在編寫程式的時候,有一些標頭檔案被許多檔案用到。例如:windows.h這樣的系統標頭檔案。如果不採用預編譯標頭檔案,那麼每個包含windows.h的檔案都需要編譯這個檔案。這將會增加編譯時間。正是為了解決這個問題,microsoft visual c++提出了預編譯標頭檔案的解決方法。

所謂預編譯標頭檔案,即將一些指定的標頭檔案預先編譯成二進位制檔案,為了與其他二進位制檔案區別開來。預編譯的標頭檔案生成的二進位制檔案以.pch結尾。在visual c++中預設使用預編譯標頭檔案,預編譯標頭檔案預設為stdafx.cpp,將那些常用的標頭檔案都放進stdafx.h中去即可。而stdafx.cpp則只包含stdafx.h乙個檔案。其他所有檔案都預設為呼叫預編譯標頭檔案,也即每個.cpp檔案都需要在第一行包括#include "stdafx.h"這樣的檔案。

當然我們也可以自己定義預編譯標頭檔案。例如建立這樣兩個檔案:mystdafx.h,mystdafx.cpp。然後將需要提前編譯的標頭檔案包含在mystdafx.h中去,並將mystdafx.h包含到mystdafx.cpp中去。將通過properties\c/c++\precompiled header中選擇create precomliled header即可。

visual c++的其他檔案都是預設使用預編譯標頭檔案的,並且預設指定了使用的預編譯標頭檔案stdafx.h,所以我們在使用了預編譯標頭檔案的.cpp檔案中必須首行包含stdafx.h。當然我們如果不想使用stdafx.h的話,可以通過properties\c/c++\precompiled header中設定not using precompiled headers。如此設定,即可以不包含stdafx.h檔案了。

當設定好了預編譯標頭檔案時,我們來看一下它是如何工作的。編譯都是以.cpp檔案為單位開始的,當編譯器發現有包括預編譯標頭檔案stdafx.h時,並不是將這個檔案通過預編譯包含進來,而是代替以相就的.pch檔案。這樣將大大節約編譯時間。

編譯鏈結過程

當一段**寫好之後進行build時,主要完成以下三個步驟。

1.  預處理階段:即由預處理器對預處理指令(#include、#define和#if)進行處理,在記憶體中輸出翻譯單元(一種臨時檔案)。還有預編譯標頭檔案並生成pch檔案。

2.  編譯階段:編譯器將記憶體中的預處理單元,及.pch檔案,並編譯.cpp檔案成生對應的二進位制.obj檔案(裡面包含的是程式的相對位址)。

3.  鏈結階段:鏈結器將所有obj檔案以及所用到的標準庫鏈結成可執行檔案.exe。

預編譯 編譯 彙編 鏈結過程

將源 或者標頭檔案經過預編譯成乙個.i檔案。例如c 副檔名是.cpp,標頭檔案的副檔名可能是.hpp,預編譯後的副檔名是.i 預編譯的過程相當於下面的命令 對c語言檔案的處理 gcc e 原始檔 o目標檔案 對c 語言的檔案的處理 g gcc e 原始檔 o目標檔案 例如 gcc e hello.c...

Linux 預編譯 編譯 彙編 鏈結過程

當我們拿到乙個.cpp的檔案,我們看到它的 但我們又是知道它是怎樣執行的?我們都知道我們所看到的 都是高階語言。但計算機底層只能識別像0,1這樣的低階語言,所以這也是乙個將c c 轉成組合語言然後再變成機器語言的過程。具體可分為預編譯 編譯 彙編 鏈結四個過程。一 在liunx中這四個階段的具體命令...

程式的預編譯,編譯,彙編,鏈結過程

預編譯過程主要處理那些源 檔案中的以 開始的預編譯指令。比如 include define 等,主要處理規則如下 1 將所有的 define 刪除,並且展開所有的巨集定義。2 處理所有條件預編譯指令,比如 if ifdef elif else endif 3 處理 include 預編譯指令,將被包...