編譯鏈結詳解

2021-04-27 05:02:22 字數 886 閱讀 1390

因為這相當於在標頭檔案裡定義了const物件。作為例外,int/char等可以進行就地初始化,是因為這些變數可以直接被優化為立即數,就和巨集一樣。

此外,對於類的const(非static)成員變數,只能在建構函式的初始化列表中初始化,不能在類內部直接賦值,也不能在類外部賦值。而對於static const的成員變數(char,int基本型別),可以在類內部直接賦值,卻不能在建構函式初始化列表中賦值,因為它是static的。對於非const的static成員變數,只能在類外部賦值。並且最好不要在定義類的.h檔案中賦值(定義),應該在類實現的.cpp檔案中賦值,防止多個檔案引用.h檔案,造成重複定義。

內聯函式:

c++裡的內聯函式由於類似於乙個巨集,因此不存在鏈結屬性問題。

為什麼公共使用的內聯函式要定義於標頭檔案裡:

因為編譯時編譯單元之間互相不知道,如果內聯函式被定義於.cpp檔案中,編譯其他使用該函式的編譯單元的時候沒有辦法找到函式的定義,因此無法對函式進行展開。所以說如果內聯函式定義於.cpp檔案裡,那麼就只有這個cpp檔案可以是用這個函式。

標頭檔案裡內聯函式被拒絕會怎樣:

如果定義於標頭檔案裡的內聯函式被拒絕,那麼編譯器會自動在每個包含了該標頭檔案的編譯單元裡定義這個函式並且不匯出符號。

如果被拒絕的內聯函式裡定義了靜態區域性變數,這個變數會被定義於何處:

早期的編譯器會在每個編譯單元裡定義乙個,並因此產生錯誤的結果,較新的編譯器會解決這個問題,手段未知。

為什麼export關鍵字沒人實現:

export要求編譯器跨編譯單元查詢函式定義,使得編譯器實現非常困難。

編譯和靜態鏈結就分析到這裡,我會帶著動態鏈結和load的詳解殺回來

C高階 詳解編譯 鏈結

被隱藏了的過程 現如今在流行的整合開發環境下我們很少需要關注編譯和鏈結的過程,而隱藏在程式執行期間的過程可不簡單,即使使用命令列來編譯乙個源 檔案,簡單的一句 gcc hello.c 命令就包含了非常複雜的過程。1 include3 int main 4 在linux系統下使用gcc編譯程式時只須簡...

Makefile詳解 程式的編譯和鏈結

在此,我想多說關於程式編譯的一些規範和方法,一般來說,無論是c c 還是pas,首先要把原始檔編譯成中間 檔案,在windows下也就是 obj 檔案,unix下是 o 檔案,即 object file,這個動作叫做編譯 compile 然後再把大量的object file合成執行檔案,這個動作叫作...

gcc預處理 編譯 彙編 鏈結詳解

讓我們來用最簡單的程式理解一下我們的編譯系統 include int main hello程式的生命週期是從乙個高階語言c語言程式開始,因為這種形式能夠人讀懂。然而,為了在系統上執行hello.c程式,每條c語句都必須被其他程式轉化為一系列的低階機器語言指令。然後這些指令按照一種稱為可執行目標程式的...