2011-11-29 95 views
3

有時候我正在閱讀一些代碼,並希望找到某個符號的定義,但它會散佈在整個代碼中,以至於grep或多或少不足以指向我對它的定義。查找變量聲明的便捷方法

例如,我正在與Zlib合作,我想弄清楚FAR的含義。

[email protected] /c/Users/Steven/Desktop/zlib-1.2.5 
$ grep "FAR" * -R | wc -l 
260 

這是很多需要掃描。事實證明,這實際上是#defineð,但它花了我一些時間來弄明白。

如果我使用的是Eclipse,我會很容易,因爲我可以將鼠標懸停在符號上,它會告訴我它是什麼。

我可以用這種方式分析代碼中的哪些工具? GCC能爲我做這個嗎? clang也許?我正在尋找一些命令行。無論如何,某種工具不是完整的IDE。

回答

1

您可能想要查看cscope,它基本上是爲此而設計的,並且是一個命令行工具(如果您喜歡,請使用ncurses)。另外,libclang(clang/llvm的一部分)可以這樣做 - 但這只是一個庫(但是我只需要100行python來使用libclang來模擬基本的cscope功能)。

cscope要求您先建立數據庫。 libclang可以解析代碼「live」。

0

gccxml,但我不知道建立在它之上的工具。鐺和LLVM也適合這樣的東西;同樣,我不知道建立在它們上面的獨立工具。

除此之外:QtCreator和code :: blocks也可以找到聲明。

1

如果該變量未在您的curernt文件中聲明,則會在包含文件中聲明該變量,即.h。所以你可以通過僅對這些文件執行grep來限制數據量。

此外,您可以使用grep的-w選項過濾整個單詞匹配項。

嘗試:

grep -w "FAR" *.h -R | wc -l 
+0

該符號還可能首次在包含在.h文件中的文件中聲明,等等......所以您的方法有時會失敗。 –

1

我們Source Code Search Engine (SCSE)是一種圖形的grep該索引根據其語言(S)的令牌的大的代碼基礎(例如,C,Java和COBOL,...)。查詢是用符號來表示的,而不是字符串,所以查找標識符不會在評論中找到它。這最大限度地減少了誤報,並且在大規模的代碼基礎中,這可能是嚴重浪費時間。找到的匹配每行顯示一個;點擊進入源文本。 可以從命令行執行查詢並獲得類似grep的響應。

I=foo* 

形式的查詢就會發現,以字母爲「foo」開頭的標識符的所有用途。

查詢可以撰寫mulitiple令牌:

I=foo* '[' ... ']' '=' 

發現分配到一個下標FOO( 「...」 表示 「接近」)。

對於C,Java和COBOL,SCSE可以查找變量的讀取,寫入,更新和聲明。

D=*baz 

查找名稱以「baz」結尾的變量的聲明。我認爲這是OP正在尋找的。

儘管SCSE適用於C++,但它目前在C++中找不到讀/寫/更新/聲明。它做了其他事情。

SCSE將處理混合語言並具有沉默。一個「I」查詢將跨越所有具有標識符的語言進行搜索,所以您可以相對容易地看到跨語言調用,因爲源和目標標識符往往因軟件工程原因而相同。

0

gcc可以輸出預處理結果,其中所有宏定義爲gcc -E -dD。輸出文件會比較大,通常是由於嵌套的系統標題。但符號的首次出現通常是聲明(定義)。輸出使用#line來顯示部分預處理結果屬於源/頭文件,因此您可以找到它最初聲明的位置。

要獲得文件編譯時的確切結果,您可能需要添加用於編譯文件的所有其他參數,例如-I,-D等。實際上,我總是複製結果編譯命令行,並添加-E -dD開始,並添加(或更改)-o以防我意外覆蓋任何內容。

0

那麼你不想要什麼「完全成熟的IDE」呢?如果它有一點速度,我發現netbeans在我上學的時候有點用處,但是真正的力量和速度以及一般效用我想推薦emacs。它有這樣的關鍵板快捷鍵。請記住,它的學習曲線是可以肯定的,但是一旦你過了駝峯,就沒有回頭路了。

+0

emacs是否實際上處理語言以確定符號的聲明位置? –

+0

下面是一些鏈接,可能會幫助你什麼emacs能夠:[鏈接](http://stackoverflow.com/questions/2790065/emacs-is-there-a-semantic-jump-to-declaration-using- semantic-el),[鏈接](http://deep.syminet.com/emacside.html) – Irony