【问题标题】:how to count all global variables in the cpp file如何计算cpp文件中的所有全局变量
【发布时间】:2013-02-02 16:29:18
【问题描述】:

是否存在任何 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 个全局变量:ancestoransvcostgraphM Npqr查询u

【问题讨论】:

  • 叹息...你试过什么?
  • 为什么需要它?而全局变量并不是一个明确的定义,因为全局变量可能通过#include指令引入,宏可能会影响声明。

标签: c++ parsing


【解决方案1】:

您可以使用以下 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 的作用。

【讨论】:

  • @LordAro 检查 grep 和 wc 的文档,文件是用 g++ 编译的,g++ 的输出是用 | 管道传输的并发送到 grep,然后将结果发送到 wc(字数统计)。
  • 很好的答案。特别是“让我们看看这是如何工作的”。 +1
  • 这是一个真正特定于平台的 hack。我进行了更改以使其也可以在您的平台上运行,但我不知道_main.eh 是什么。您可以在管道中添加| grep -v .eh 以排除它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 2011-09-09
  • 2020-04-30
  • 2020-10-03
相关资源
最近更新 更多