我想知道是否有一個工具(也許GNU C++編譯器)從一個.cpp文件中獲取 完整的函數.hpp文件與提到的函數聲明。如何從實現(.cpp文件)中提取聲明(.hpp文件)?
例:
我:
magic.cpp
int foo() { return 42; }
char bar() { return 'z'; }
而且我想運用奇妙的工具後獲得這樣的:
magic.hpp
int foo();
char bar();
我想知道是否有一個工具(也許GNU C++編譯器)從一個.cpp文件中獲取 完整的函數.hpp文件與提到的函數聲明。如何從實現(.cpp文件)中提取聲明(.hpp文件)?
例:
我:
magic.cpp
int foo() { return 42; }
char bar() { return 'z'; }
而且我想運用奇妙的工具後獲得這樣的:
magic.hpp
int foo();
char bar();
請參閱Dehydra or Treehydra。這兩個工具中的一個應該允許您通過GCC執行此操作。
Dehydra是一款輕量級,可編寫腳本的通用靜態分析工具,能夠對C++代碼進行特定於應用程序的分析。
要準確地做到這一點,你需要一個完整的C++解析器和名字解析,因爲你需要的不僅是函數的聲明也使他們明確的背景下。舉例來說,如果你有一個聲明
void foo<T>(...){ ... }
在文件中,並有一個類型T的文件中,你最好保留聲明T,以及任何聲明用來定義T,等等。所以你有保持 定義的網絡支持foo ...並且您必須決定是否要保留包含文件的文件。
我們的DMS Software Reengineering Toolkit是可定製的通用程序分析和轉換機械。通過它的C++ Front End,可以解析C++代碼(包括#includes),構建抽象語法樹(AST),解析開箱即用的名稱和類型。然後,定製代碼將確定必要的引用網頁,並且對於每個引用,通過將source-to-source program transformations應用於AST,將其轉換爲簽名(而不是實現)。 DMS的漂亮打印機可以生成最終的輸出文本。
DMS已被用於其他大型項目的大規模C++(重新)工程。
當然,如果您不介意可能需要手動修補的答案,您總是可以編寫一些不好的黑客來模擬此操作。
很好的回答!我想知道這不容易。但我永遠不會認爲它在開源世界沒有解決。現在,我寫的是爲我的大學開設一門課程項目的代碼,所以你給我提供的是超出範圍的。但它似乎是正確的工具。我會等待一個更公衆友好的解決方案,但如果這從未發生,我認爲這是最好的解決方案。 – msemelman 2011-12-23 00:03:20
[求代碼存根發生器(來自頭文件)]的可能重複(HTTP://計算器.com/questions/2020568/seeking-code-stub-generator-from-header-files) – 2011-12-22 23:39:34
使用'/ /'搜索並替換''''/ *'和'}'會做到這一點,儘管不是好的解決方案 – Pubby 2011-12-22 23:40:34
@Tim:這是另一種方式,不是嗎? – Xeo 2011-12-22 23:41:34