ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

从C源文件创建全局变量列表

2019-07-09 20:50:37  阅读:287  来源: 互联网

标签:c-2 linux ctags nm


我正在处理问题,它的语句 – 生成文本文件,其中列出了.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源文件的文件名,扫描它以查找全局变量(忽略const)并写入报告“filename [变量列表].
我遇到的主要问题是ctags在某些情况下忽略了STL类型.

例如,它可以排除行ike“vector v;”,但包括“std :: vector v;”.

有没有办法解决这个问题?尝试使用ctags -I ./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&lt; int &gt;</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文件后,您应该能够提取出您正在寻找的信息.

标签:c-2,linux,ctags,nm
来源: https://codeday.me/bug/20190709/1416911.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有