C程式理解(棧,GCC, h檔案)

2021-08-19 03:11:58 字數 929 閱讀 8014

.h .lib .dll檔案

.h檔案是編譯器編譯時必須要的,預處理會找到相對應的標頭檔案中的宣告,才可以順利完成編譯。如果這個檔案中某個函式使用沒有在本檔案中宣告,也沒有在包含的標頭檔案中宣告,就會出錯。

.lib是鏈結時必須的, 告訴鏈結器呼叫的函式在哪個dll中,函式執行**在dll中的什麼位置,它起到橋梁的作用。如果生成靜態庫檔案,則沒有dll ,只有lib,這時函式可執行**部分也在lib檔案中

.dll檔案是執行時必須的。

靜態編譯的lib檔案有好處:給使用者安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程式比較大,而且失去了動態庫的靈活性,動態庫可以節省記憶體資源。

gcc使用

c程式的棧(函式呼叫)

返回位址先於引數入棧是不可能的== 因為引數入棧是呼叫函式通過push指令完成的 而返回位址入棧則是在call指令中自動完成的 因此如果一定要先把返回位址壓棧 就需要先呼叫call指令 call指令返回之後 程式就已經在被調函式裡面了 呼叫函式已經失去了控制權 不可能再通過push指令把引數壓棧了……

此外額我覺得這涉及到x86的乙個規範吧…… 函式呼叫時引數壓棧和被調函式返回後引數出棧都是由呼叫函式來完成 被調函式不參與(否則如果兩者同時參與很容易把棧搞混亂) 如果引數在返回位址上方 被調函式返回的時候 為了取得返回位址 被調函式必須先把引數出棧 這就與之前說的規範衝突了

因為存在不定參的函式,引數的壓棧順序是從右到左。

C程式棧空間

例項1 探索區域性變數在記憶體中的存放方式 includeusing namespace std struct student int main int main a 2,b 1 x 2.200000,y 1.100000 str1 luse,str2 jackkk 對於str1和str2時間上是交...

C程式儲存布局 棧

所有的自動變數以及函式呼叫時所需要儲存的資訊 返回位址 函式呼叫前各暫存器的值等 都儲存在棧上。每次呼叫函式時,棧會隨著函式的呼叫而生長,隨著函式呼叫結束而消亡。自動變數有3種儲存方式 一是儲存在資料段或者bss段 靜態區域性變數 一是儲存在暫存器裡 暫存器變數 一是儲存在棧中 一般自動變數 由於絕...

C 棧物件 堆物件 理解

在c 中,類的物件建立分為兩種,一種是靜態建立,如a a 另一種是動態建立,如a ptr new a 這兩種方式是有區別的。1 靜態建立類物件 是由編譯器為物件在棧空間中分配記憶體,是通過直接移動棧頂指標,挪出適當的空間,然後在這片記憶體空間上呼叫建構函式形成乙個棧物件。使用這種方法,直接呼叫類的建...