2011-12-22 119 views
5

我想知道是否有一個工具(也許GNU C++編譯器)從一個.cpp文件中獲取 完整的函數.hpp文件與提到的函數聲明。如何從實現(.cpp文件)中提取聲明(.hpp文件)?

我:
magic.cpp

int foo() { return 42; } 
char bar() { return 'z'; } 

而且我想運用奇妙的工具後獲得這樣的:
magic.hpp

int foo(); 
char bar(); 
+0

[求代碼存根發生器(來自頭文件)]的可能重複(HTTP://計算器.com/questions/2020568/seeking-code-stub-generator-from-header-files) – 2011-12-22 23:39:34

+0

使用'/ /'搜索並替換''''/ *'和'}'會做到這一點,儘管不是好的解決方案 – Pubby 2011-12-22 23:40:34

+0

@Tim:這是另一種方式,不是嗎? – Xeo 2011-12-22 23:41:34

回答

3

請參閱Dehydra or Treehydra。這兩個工具中的一個應該允許您通過GCC執行此操作。

Dehydra是一款輕量級,可編寫腳本的通用靜態分析工具,能夠對C++代碼進行特定於應用程序的分析。

2

要準確地做到這一點,你需要一個完整的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++(重新)工程。

當然,如果您不介意可能需要手動修補的答案,您總是可以編寫一些不好的黑客來模擬此操作。

+0

很好的回答!我想知道這不容易。但我永遠不會認爲它在開源世界沒有解決。現在,我寫的是爲我的大學開設一門課程項目的代碼,所以你給我提供的是超出範圍的。但它似乎是正確的工具。我會等待一個更公衆友好的解決方案,但如果這從未發生,我認爲這是最好的解決方案。 – msemelman 2011-12-23 00:03:20

4

在基於Debian的發行:

apt-get install cproto 

cproto magic.cpp然後給出以下輸出:

/* magic.cpp */ 
int foo(void); 
char bar(void); 
+0

Waw!很好的回答! – msemelman 2011-12-23 03:57:14

+0

哦,不,它只適用於C(普通C)。我正在尋找一個C++工具。不管怎麼說,還是要謝謝你! – msemelman 2011-12-23 03:59:50

+0

對不起,那時我沒有意識到。 – 2011-12-23 04:13:48