2

この問題を解決する 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グローバル変数あります。_ _ _ _ _ _ _

4

1 に答える 1

8

次のシェル コマンドを使用して、コンパイラを呼び出し、エクスポートされたグローバル変数をカウントできます。

$ 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.cppB.o: これは、出力 (デフォルトでは) がほとんど削除された識別子のないコンパイル済みファイルになるように、最適化なしでコンパイラを呼び出します。

  2. nm B.o: nmを (リンクから引用) 「オブジェクト ファイルからシンボルをリストする」ツールを呼び出します。たとえば、「シンボルが初期化されていないデータセクションにある」場合、「B」があります。

  3. U、T、または W ではなく、グローバル値 (大文字を意味する) が必要です。これが grep の機能です。

于 2013-02-02T16:34:19.780 に答える