簡體   English   中英

如何在C ++中查找函數的所有調用者?

[英]How to Find All Callers of a Function in C++?

我正在用C ++重構一些代碼,我想棄用一些舊的方法。 我目前查找所有方法的方法如下所示:

  1. 在我正在使用的源文件中注釋掉原始方法。
  2. 嘗試編譯代碼。
  3. 如果找到編譯器錯誤,則在注釋中注釋注釋並嘗試重新編譯。
  4. 編譯成功完成后,我找到了所有的調用。

這完全很糟糕。 我也嘗試過grepping source來獲取函數調用的名稱,但是我有時會遇到帶有不同參數的同名函數的問題,所以我的編譯讓C ++編譯器為我解析名稱。 我已經為C#找到了這個問題 ,但我的代碼庫完全用C ++實現。

有沒有更好的方法來找到C ++中類方法或函數的所有調用者? 我在Unix系統上使用GCC,但跨平台解決方案將是最高級的。

GCC允許您使用__attribute__((deprecated))來裝飾變量,函數和方法,這將在所有調用項上引發警告(除非-Wno-deprecated-declarations )。

class A {
public:
    A() __attribute__((deprecated)) {}
};
int main() {
    A a;
}
$ g++ test.c
test.cc: In function ‘int main()’:
test.cc:6: warning: ‘A::A()’ is deprecated (declared at test.cc:3)

Eclipse可以在沒有任何插件的情況下完成。 對於像這樣的東西,它可以是一個有用的工具,即使你不想將它用於你的日常編輯器。

  1. 下載,安裝和運行Eclipse CDT
  2. 轉到File,New,C ++ Project下。 輸入項目名稱,然后從“項目類型”樹視圖中選擇“空Makefile”項目。 取消選中“使用默認位置”,然后輸入保存項目的文件夾。
  3. 單擊Next,然后單擊Finish。
  4. Eclipse將自動開始為您的項目編制索引。 如果它確實是一個Makefile項目,並且因為你正在使用g ++,你可以完全清理然后在Eclipse中構建(在Project菜單下),它應該自動使用你現有的makefile並自動發現你的include目錄和其他項目設置。
  5. 在源文件中找到重載函數的原型,右鍵單擊它,選擇“引用”,然后選擇“項目”。 Eclipse將在項目中找到對該函數的所有引用,並且僅查找該函數的特定重載。

您還可以使用Eclipse的內置重構支持來重命名重載的函數,以便它們不再過載。 Eclipse也是完全跨平台的; 您可以使用其索引器,搜索引用和重構等功能,即使是在其他IDE中維護和構建的項目也是如此。

一種選擇是通過像Cscope這樣的程序運行整個項目。 它基本上解析了項目的整個源代碼,並構建了一個數據庫,允許輕松搜索所有函數的調用者,所有引用等。

我知道它對C來說效果很好,並且他們聲稱它適用於C ++。 KScope是它的KDE GUI前端。

我想你想要的是看一個調用圖。 有關如何執行此操作的一些好建議,請參閱此問題

對於任何想在Windows下的Visual Studio中執行此操作的人....

視覺輔助非常好。 它對許多C ++重構,調用圖,重命名,自動創建頭定義或生成方法等等都有很大的幫助。它並不完美,不像Java / C#重構工具的質量,但對C ++真的很好!

這個Eclipse插件可能是正確的工具: CallGraph View

這就是我如何做到的。 如果你的代碼全部在同一個地方,那么“grep”(或發現| grep combo)也可以做到這一點。

一個caviat:此方法經常會錯過未有條件地編譯到當前配置中的實例。 如果您的代碼使用#ifdefs來支持多個配置,那么一個徹底的人將嘗試使用每個配置進行編譯以捕獲所有實例。

如果您讓Eclipse CDT索引成為源代碼庫,那么您應該能夠查看任何函數的調用層次結構,甚至可以執行一些重構。

您可以下載適用於C / C ++開發人員的Eclipse IDE(希望您可以找到適合您的特定* NIX的端口)並按照他們的說明開始使用。

在visual studio中,右鍵單擊函數名稱,然后單擊“調用瀏覽器”>“顯示調用者圖”

然后在顯示窗口中應該有一個名為“調用函數”的文件夾,其中包含調用該函數的所有位置,每個位置都可以在代碼中雙擊它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM