2010-05-06 35 views
11

無論我們是維護不熟悉的代碼還是檢查Apache模塊的實現細節,它都可以幫助我們快速遍歷代碼並構建一個概覽,再看。 Grep服務於我的大部分日常需求,但也有一些情況下它不會這樣做。列出C/C++函數(在Unix中的代碼分析)

下面是它如何提供幫助的常見示例。爲了找到一個PHP函數我有興趣,我可以在命令行中鍵入此的定義:

grep -r "function myfunc" . 

這可以很快適應C或C++如果我們知道的返回類型,但事情變得更復雜比如說,如果我想列出每一個我的類提供方法:

grep "function " ./src/mine.class.php 

既然有這麼表示在C++函數或方法沒有單一的關鍵字,因爲它通常更復雜的語法,我想我需要某種靜態代碼分析工具,聰明地使用C預處理器或盲目的信任編碼器遵循嚴格的代碼準則(#空格,捲曲位置等等)來獲得這些結果。

你會推薦什麼?

回答

15

通過Doxygen運行它。它會抱怨缺少評論,但它仍然會生成調用圖並列出所有功能。用HTML提供鏈接,以便遵循代碼路徑。

doxygen

+2

+1您還應該啓用生成以HTML格式輸出源代碼的選項(「SOURCE BROWSER」)。生成的代碼將包含可輕鬆導航源代碼的超鏈接。 – 2010-05-06 20:36:56

+0

+1我剛開始使用Doxygen使用GraphViz生成圖表來幫助我記住數據流。 – 2010-06-26 11:07:39

9

旺盛Ctags的http://ctags.sourceforge.net/

我只用它不時前一段時間,並從文本編輯器中,但檢查出的公用事業/工具,可以使用它的列表:

http://ctags.sourceforge.net/tools.html

+0

ctags非常適合調查新代碼,並且受IDE和編輯者的廣泛支持。進入您正在查看的目錄,執行'ctags -R',啓動您最喜愛的編輯器並跳轉代碼。在vim中使用'ctrl-]'跳轉到一個定義,'ctrl-t'跳回。 – Winder 2010-05-06 19:00:23

4

Doxygen能夠產生一些合理的HTML文檔,並解析了意見。這並不完美,但它可能會有所幫助。您可以將Ctags整合到您的編輯器中,讓您跳轉到您要查找的功能。

就個人而言,我使用grep;)

+0

當我需要找到某些東西時,我也在我自己的項目中使用grep ...但是編輯代碼的真正IDE並且只是聲明/定義只是一個噱頭而已,實在太強大而無法傳遞IMNSHO。 – 2010-05-06 19:04:55

+0

對於我不熟悉的項目,我完全同意一個IDE太棒了。 – Stephen 2010-05-06 20:21:47

2

grep '^[a-zA-Z0-9][ *]+ {[a-zA-Z0-9_]+}\([a-zA-Z0-9\,\.\-\>]\*\)$'

大致是你想要的。它可能需要玩一些,但匹配一個有效的C++返回類型,給出它是一個指針,然後是一個函數名稱(這將是\ 1),打開圓括號,參數,關閉的選項。

一般形式(返回,名稱,(參數))應該工作,除非你可能在函數聲明中有換行符。

我會使用Doxygen或其他工具來解析它,但如果你需要快速和一次地做到這一點,正則表達式可能會更容易(或可能不會,與正則表達式,你永遠不知道)。

4

cscope對這類事情非常好。與ctags不同,cscope提供了一個適合搜索的界面(ctags需要一個編輯器)。

只需在要檢查的代碼的根目錄中運行cscope。它會:創建一個數據庫,如果一個不存在,更新數據庫,如果一個是存在的,並打開一個詛咒GUI,您可以查詢各種有用的信息

  • 一個符號
  • 全球所有引用定義
  • 功能由一個函數調用
  • 函數調用一個函數
  • 文本字符串
  • 正則表達式模式
  • 文件
  • 文件,包括文件

的ctags只做第一個,「以符號的所有引用」。