从C++源文件创建全局变量列表
Creating a list of global variables from C++ source file
我现在正在处理这个问题,它的语句-生成一个文本文件,其中包含.CPP文件中所有声明的全局变量的列表。
我想出了几个主意,第一个:
尝试使用ctags,所以我写了一些简短的脚本:
while read line
do
echo $line
printf "%s" $line >> report.txt
ctags -x --c++-kinds=v --file-scope=no "{$line}" | sort | sed "/const/d" | awk '{printf " %s", $1}' >> report.txt
printf "n" >> report.txt
done < cpp_source_file_list.txt
这段代码从cpp_source_file_list.txt中获取.cpp源文件的文件名,扫描它以查找全局变量(忽略常量),并编写报告"filename[变量列表]"。我遇到的主要问题是ctags的行为非常奇怪,在某些情况下忽略STL类型。
例如,它可以排除类似"vector v;"的行,但包括"std::vector v!"。
有什么办法解决这个问题吗?尝试使用ctags-我/id.txt添加了关键字,并手动列出要覆盖的标识符,但它也带来了不正确的结果。
第二种方式:
使用nm命令,如:
nm builtsource.o | grep '[0-9A-Fa-f]* [BCDGRS]'
但在这种情况下,我收到了不必要的信息,比如:
0000000000603528 B M
0000000000603548 B N
0000000000603578 B _ZSt3cin@@GLIBCXX_3.4 <- (!)
0000000000603579 B _ZSt4cout@@GLIBCXX_3.4 <- (!)
0000000000603748 B t
现在,我不知道如何改进其中一个方法,以便从任意.cpp源文件中接收有关声明的全局变量列表的正确信息。我很乐意听到关于这个问题的任何建议。
您可以利用Doxygen来实现这一点。Doxygen可以解析C++文件并生成一个XML文件,该文件捕获文件中遇到的所有变量。具体来说,如果您设置了以下配置选项:
EXTRACT_ALL= YES
GENERATE_TAGFILE= doxygen.tag
给定一个输入文件,如:
#include <vector>
using namespace std;
std::vector<int> s1;
vector s2;
您可以生成具有以下内容的输出doxygen.tag
文件:
<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?>
<tagfile>
<compound kind="file">
<name>input.cpp</name>
<path>C:/Users/haney/tmp/tmp55/</path>
<filename>input_8cpp</filename>
<namespace>std</namespace>
<member kind="variable">
<type>std::vector< int ></type>
<name>s1</name>
<anchorfile>input_8cpp.html</anchorfile>
<anchor>93b3bd32f5b6bff31bc4052716ddd444</anchor>
<arglist></arglist>
</member>
<member kind="variable">
<type>vector</type>
<name>s2</name>
<anchorfile>input_8cpp.html</anchorfile>
<anchor>8feb4a508135e43a72f227568b755a07</anchor>
<arglist></arglist>
</member>
</compound>
<compound kind="namespace">
<name>std</name>
<filename>namespacestd.html</filename>
</compound>
</tagfile>
一旦您有了XML文件,就应该能够提取出您要查找的信息。
另一种可能性是为此目的开发GCC插件或MELT扩展。您需要了解GCC内部表示(Gimple和Tree)的一些细节。
自定义GCC(使用C中的插件或MELT中的扩展)的优点是,您可以处理精确的编译器内部(在预处理和解析之后)。然而,这需要你付出一些努力。
您可能会考虑使用GCC-XML,可能会在顶部添加其他内容(如pygccxml),以使导航更容易。我已经成功地将这种组合用于类似的代码提取目的。
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- C ++程序如何返回我的数组或写入全局变量
- 为什么我的数组值与此处的全局变量不匹配?
- QT C++中对全局变量的未定义引用
- 跨多个类的全局变量而不会出现重定义错误?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++线程不检测全局变量更改
- 在 elf 文件中查找全局变量的位置
- 从C++源文件创建全局变量列表