[英]How to Find All Callers of a Function in C++?
我正在用C ++重構一些代碼,我想棄用一些舊的方法。 我目前查找所有方法的方法如下所示:
這完全很糟糕。 我也嘗試過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可以在沒有任何插件的情況下完成。 對於像這樣的東西,它可以是一個有用的工具,即使你不想將它用於你的日常編輯器。
您還可以使用Eclipse的內置重構支持來重命名重載的函數,以便它們不再過載。 Eclipse也是完全跨平台的; 您可以使用其索引器,搜索引用和重構等功能,即使是在其他IDE中維護和構建的項目也是如此。
對於任何想在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.