C/C++ 程式是如何執行的
阿新 • • 發佈:2021-01-03
眾所周知——我們在學習的時候,課本上是這樣寫的,一個程式的執行需要四步:::
原始檔 經過預處理階段 -> 編譯階段 -> 彙編階段 -> 連結階段 -> 可執行
下面以一個平凡的例子,來描述自己的疑惑和所學。
#include <stdio.h>
int main()
{
printf("hello");
return 0;
}
1、預處理階段。
前處理器根據以字元 # 開頭的命令,修改原始的C程式。例如,hello.c 的第一行 #include <stdio.h> 命令告訴前處理器讀取系統標頭檔案的內容,並把其直接插入到程式文字中,結果就得到了另一個檔案,通常以點 i作為副檔名。
#include < >直接按系統標準方式檢索檔案目錄。
#include " "在當前的原始檔的目錄中尋找,找不到再按照系統標準方式檢索其他檔案目錄。
2、編譯階段。
編譯器將文字檔案 hello.i 翻譯成成文字檔案 hello.s ,它包含一個組合語言程式。
3、彙編階段。
彙編器將 hello.s 翻譯成機器語言指令,把這些指令打包成一種叫做可重定位目標程式的格式,並將結果儲存在目標檔案 hello.o 中,其是一個二進位制檔案。
4、連結階段
hello程式呼叫了 printf 函式,printf 函式存在於一個名為 printf.o 的單獨的預編譯好的檔案中,而這個檔案需要以某種形式合併到 hello.o 中,聯結器就負責這裡的合併。
下圖為上面四個階段的圖形表示。
存在一個問題,在預處理階段,將 #include<stdio.h>載入進來後,有了printf 函式的宣告,後面的連結階段,是如何知道 printf 的實現位置,進而連結。??(從標頭檔案如何知道函式原型的實現位置)