1. 程式人生 > 其它 >C/C++ 程式是如何執行的

C/C++ 程式是如何執行的

技術標籤:C/C++c++

眾所周知——我們在學習的時候,課本上是這樣寫的,一個程式的執行需要四步:::

原始檔 經過預處理階段 -> 編譯階段 -> 彙編階段 -> 連結階段 -> 可執行

下面以一個平凡的例子,來描述自己的疑惑和所學。

#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 的實現位置,進而連結。??(從標頭檔案如何知道函式原型的實現位置)