2013-02-02 42 views
2

它是否存在任何cpp代碼解析器來解決此問題?例如如何計算cpp文件中的所有全局變量

// B.cpp : Defines the entry point for the console application. 
// 
#include<iostream> 
#include<vector> 
#include<algorithm> 

size_t N,M; 
const size_t MAXN = 40000; 
std::vector<std::pair<size_t,size_t> > graph[MAXN],query[MAXN],qr; 
size_t p[MAXN], ancestor[MAXN]; 
bool u[MAXN]; 
size_t ansv[MAXN]; 
size_t cost[MAXN]; 

size_t find_set(size_t x){ 
    return x == p[x] ? x : p[x] = find_set(p[x]); 
} 

void unite(size_t a, size_t b, size_t new_ancestor){ 

} 

void dfs(size_t v,size_t ct){ 

} 

int main(int argc, char* argv[]){ 

return 0; 
    } 

該文件有10個全局變量:祖先ansv成本圖表中號ÑpQR查詢u

+0

*嘆了口氣...... *你有什麼試過? – antonijn

+0

你爲什麼需要它?和*全局變量*不是一個明確的定義,因爲全局變量可能通過'#include'指令引入,並且宏可能會影響聲明。 – xiaoyi

回答

8

你可以調用編譯器,並用下面的shell命令算導出的全局變量:

$ g++ -O0 -c B.cpp && nm B.o | grep ' B ' | wc -l 
10 

如果刪除行數,你會得到他們的名字

$ g++ -O0 -c B.cpp && nm B.o | egrep ' [A-Z] ' | egrep -v ' [UTW] ' 
00000004 B M 
00000000 B N 
00111740 B ancestor 
00142480 B ansv 
00169580 B cost 
00000020 B graph 
000ea640 B p 
000ea620 B qr 
00075320 B query 
00138840 B u 

讓我們來看看它是如何工作。

  1. g++ -O0 -c B.cpp:這需要不優化編譯器使得輸出(B.o默認情況下)是相當多的,而不刪除標識符編譯的文件。

  2. nm B.o:撥打電話nm(引用鏈接)「列出來自目標文件的符號」的工具。例如,如果「該符號位於未初始化的數據部分中」,則存在「B」。

  3. 我們希望具有全局值(意思是大寫)但不是U,T或W.這就是grep所做的。

+0

小心分享這是如何工作的? – LordAro

+0

@LordAro檢查grep和wc的文檔,文件是用g ++編譯的,g ++的輸出是用|併發送給grep,結果發送到wc(字數)。 –

+0

很棒的答案。特別是「讓我們看看它是如何工作的」。 +1 – flies