誰知道函式的結構,編譯後,各結構是如何變化的?BtOfficer2021-06-05 19:27:50

簡單說幾點吧

一、函式分類

1、庫函式

也即其他DLL中的函式,如系統庫(Ntdll、Kernel32、User32、Advapi32、Ole32等)、特定支援庫(msvbvm60,Scrrun等)、第三方庫。

2、工程內地自定義函式

拿VB/VBA來說,也即在窗體模組、標準模組和類模組中的Sub/Function/Property。

二、函式的結構

簡單來講為:函式頭+函式體。函式頭,對於C/C++而言,類似於標頭檔案中給出的定義那樣。包括返回型別、調約、函式名、引數列表等要素,而函式體就是工程中{}裡寫的那些。對於VB/VBA而言,函式頭就是包含Sub/Function/Property關鍵字的那一行,函式體就是函式頭與End Sub或Function或Property之間部分。

更多詳情,可關注後,參閱《VB/VBA中的函式,用了那麼久,其實是這樣的》及相關文章。

三、函式的使用

對於工程內自定義的函式,按許可權符的作用域進行呼叫即可,C/C++和VB/VBA間沒啥好大的差異。但對於庫函式,C/C++和VB/VBA間,則有著很大的差異。

對於系統庫而言,都是C/C++寫的,因此都有相應的標頭檔案,使用時只需匯入標頭檔案即可,無需像VB/VBA那樣使用Declare語句進行宣告,也沒啥限制。但VB/VBA是基於COM的,由於設計上側重於低門檻和安全,包括指標等一系列表達方式被隱藏起來。像函式指標、C調約的函式等,在VB/VBA中,就需要更深入瞭解這門語言,才能使用。

那VB/VBA中使用庫函式的方式有哪些呢?目前來看,有3種方式:

1、大家熟悉的Declare進行宣告。

但是,隨著對VB/VBA的瞭解,該語句只是為MSVBVM提供引數的,類似於函式頭的作用,並非直接呼叫。因為像C/C++使用的庫函式,都會進入匯入表中,而VB/VBA的程式裡卻沒有。該語句的優劣,其實在以往的文章中,已有介紹,感興趣的朋友可關注後查閱。

2、與標頭檔案對等的方式,即型別庫。

VB/VBA是基於COM的,自然無法使用標頭檔案,但可以使用型別庫,其作用與標頭檔案一樣。在VB/VBA的IDE中,使用的各項語句、內建函式、程式碼智慧提示和自動化補齊等,均屬透過該種方式。更多型別庫相關內容,可關注以前及後續相關文章哦。

3、動態呼叫。

這點,其實和C/C++中一樣,獲取並使用函式指標。但在VB/VBA中除了AddressOf可以獲得函式指標外,沒有現成貨可用,即便能獲得函式指標,函式指標的使用又是大問題。要解決這一問題,就需要對COM進行深入的瞭解,這是一個龐大而複雜的認知過程。深入瞭解COM後,就會明白,VB/VBA其實就是滑鼠拖拽的C。感興趣的朋友,可關注查閱以往文章及後續文章,VB/VBA有的,可不是網上流傳的蹩腳多執行緒和內嵌彙編。

四、函式各部分在編譯中的作用

函式名的作用是什麼呢?在PE的結構中,有匯出表。只有匯出的函式,才可能被第三方使用。而匯出時,處於效能或產品策略,一般有按名稱和序號兩種匯出方式。系統庫中,通常只有按名稱匯出的部分才會被文件化,大家才更容易使用。而當大家使用函式指標時,函式指標總是指向函式體。

提個小問題:如果定義一個函式,但誰也不使用,編譯後會是怎樣子的呢?歡迎留言討論哦。

歡迎關注BtOfficer

,更多VB/VBA/VBS高階內容,等你哦。

誰知道函式的結構,編譯後,各結構是如何變化的?lipbw2021-04-17 17:16:35

哥們,想了解c語言編譯後是啥樣子,就需要學組合語言了,組合語言和機器語言是等價的。