「虐心」的獲取C 函式列表

2021-12-30 05:46:51 字數 1291 閱讀 6564

今天在這裡和大家分享一下如何獲取c++檔案中的函式列表,問題和靈感來自於同事小w自開發的c++**覆蓋率工具,原理是通過給現有的**進行打樁,在執行到該函式的時候對該函式進行標記,最終統計得到**的函式覆蓋度。

如圖:程式的源**

經過打樁後的**

原理大致如下,這裡就不給大家詳細介紹了。

那麼問題的重點來了,如何解析並且獲取cpp檔案中的函式呢?

首先想到的方法是的利用編譯原理的思想通過新增規則的方法去獲取函式,如:對「」,「(」,「)」進行字元匹配來判斷乙個函式的開始和結束。最開始頗有成效,可以款速的分下簡單的**,但是隨著在輸入法專案中的實戰應用出現的問題越來越多。如圖,在函式的宣告的時候使用了巨集定義的情況下對函式判斷失敗

1. 函式定義中包含巨集的情況,沒有辦法識函式名。

2. 函式內部如果使用了巨集定義可能會出現括號不匹配的情況導致死迴圈的出現。

等等,隨著在專案中的不斷深入出現各種各樣複雜的環境引發的問題,再對這些問題新增規則規避的同時還可能引發新的問題。每次因為修改問題又引發新問題的同時近乎崩潰!!!

於是乎我們可能需要尋找一種新的方法去得到cpp檔案中的函式。靈感一來自于notepad++它是如何對函式進行解析的呢?調研發現notepad++可以使用外掛程式function list對cpp檔案進行解析,萬幸這個外掛程式是提供原始碼的!!!發現notepad++解析cpp檔案也是按照一定的規則來做的,如圖:

這樣我們只需要把外掛程式重新打包成乙個dll檔案在我們的工程中使用就可以滿足我們的需求了,這樣做的優點是節省了我們去編寫各種各樣的規則,不足之處是對於我們奇葩的**它還是有無法識別的函式,而且最重要的是我們還不知道如何新增規則,oh my gad!

僅僅為了獲取函式名,就在函式體中嵌入硬編碼的字串,這種方法單調乏味還易導致錯誤,不如看一下怎樣使用新的c99特性,在程式執行時獲取函式名吧。答案是:使用__function__ 及相關巨集。如圖:通過巨集定義獲取函式名。

C 部分函式列表

字串替換 如 string str 中國 str str.replace 國 央 將國字換為央字 response.write str 輸出結果為 再如 這個非常實用 string str 這是指令碼 str str.replace 將左尖括號替換為與 與 或換為 但估計經xml存諸后,再提出仍會還...

c 類 函式列表

string 函式列表 函式名 描述 begin 得到指向字串開頭的iterator end 得到指向字串結尾的iterator rbegin 得到指向反向字串開頭的iterator rend 得到指向反向字串結尾的iterator size 得到字串的大小 length 和size函式功能相同 m...

C可變引數列表函式

c語言中可以定義接收不同的引數的函式 可變引數的函式可以接收不同數目的引數,但是需要注意的是c語言中函式的引數個數不能超過5個。可變引數的函式的原型如下int narg sum int arg num,在引數列表中至少要有乙個命名的引數。可變引數函式的實現需要用到va start va arg va...