C++程式如何編譯執行
下面是C++入門的hello world
程式原始碼
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
cout << "hello world" << endl;
return 0;
}
你可以在將上述原始碼複製貼上到我的線上編譯上執行。
程式各行解析
-
#include <iostream>
引入iostream
標頭檔案。 -
using namespace std
使用std
命令空間,命令空間可防止名稱汙染。 -
int main(int argc, char* argv[])
入口函式定義,入口函式是由作業系統呼叫的。 -
cout << "hello world" << endl
在控制檯列印hello world
字串,cout
中控制檯輸出裝置抽象出來的物件,<<
是cout的輸出運算子(也可以理解為輸出裝置的print
方法),endl
是換行標誌。 -
return 0
向作業系統返回一個整形處理結果,作業系統會捕獲這個整形數,一般程式執行成功會返回0
,執行異常會返回負數。
hello world
程式如何執行
程式語言編寫的原始碼實際上是人類可以理解自然語言,但計算機只認識二進位制指令,所以我們要將原始碼翻譯成二進位制機器碼,這樣計算機才能知道你的意圖。這個將原始碼翻譯成二進位制機器碼的過程我們稱之為編譯。C++的整個編譯過程又可細分為以下步驟:
-
預處理 預處理可以簡單理解為編譯器將原始碼中的預處理指定(以
#
號開頭行)轉換成相應程式碼。如#include
指令就是將#include
指定的檔案直接包含進來。 -
將原始檔轉換成目標檔案 將原始檔(
.cpp
檔案)轉換成目標檔案(.o
檔案),這個過程就是前原始碼轉換成二進位制機器碼,但針對原始碼中引用其他類庫的變數、函式編譯器只知道他們的宣告(一般包含在標頭檔案中)也不知道其定義,所以編譯只會檢查變數、函式是否已宣告,函式呼叫引數與宣告是否一致,做完這些操作後編譯器的任務就完成了,最終編譯輸出目標檔案(.o
檔案)。 -
目標檔案與庫檔案進行連結 將目標檔案中引用其他庫的變數、函式等與二進位制庫檔案中定義變數進行替換或建立關聯關係。如果是變數、函式在靜態庫中定義,則連結器會將靜態庫中變數、函式定義打包複製一份到最終程式檔案中,然後修改變數、函式的指向程式中的具體偏移地址。如果是變數、函式在動態庫中定義,則連結器會將變數、函式指向動態庫中具體地址。完成上面操作後生成可執行檔案。
-
執行可執行檔案 在控制檯輸入可執行檔案路徑或在資源管理器中雙擊可執行檔案就可執行可執行程式,程式實際上是作業系統裝載執行的,作業系統能理解程式的二進位制檔案格式,然後分配程式執行所需的棧空間、程式碼段、靜態儲存區、對映堆空間地址等,作業系統會建立一個程序結構體來管理程序,然後將程序放入就緒佇列,等待CPU排程執行。程序的記憶體模型大致如下:
上面hello word
程式中的main函式實際上是作業系統呼叫的,main函式執行完成會返回一個整形變數給作業系統。我們可以認為main函式是程式執行入口函式,但main並不是程式執行開始,全域性變數的初始化(建構函式)是在進入main函式之前進行,相應的main函式return語句也是程式執行的最後程式碼,全域性變數的銷燬(解構函式)是在main函式結