4

私は現在、問題、そのステートメントに取り組んでいます-.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 タイプ。

たとえば、「vector v;」という行を除外して、「std::vector v;」を含めることができます。

このような問題を解決する方法はありますか? ctags -I ./id.txt 追加キーを使用して、オーバーライドする識別子のリストを手動で作成しようとしていますが、誤った結果ももたらします。

2 番目の方法:

次のような 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 

そして今、これらのメソッドの1つを改善して、宣言されたグローバル変数のリストに関する正しい情報を任意の.cppソースファイルから取得する方法がわかりません。この問題について何か提案をいただければ幸いです。

4

3 に答える 3

1

これを実装するために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 ファイルを取得したら、探している情報を抽出できるはずです。

于 2012-01-31T06:05:56.430 に答える
0

ナビゲートしやすくするために、GCC -XMLを使用することを検討してください。この組み合わせを同様のコード抽出の目的で使用することに成功しました。

于 2012-01-31T05:18:56.040 に答える
0

別の可能性は、その正確な目的のためにGCC プラグインまたはMELT拡張機能を開発することです。GCC の内部表現 (Gimple と Tree) の詳細を理解する必要があります。

GCC を (C のプラグインまたは MELT の拡張機能を使用して) カスタマイズする利点は、(前処理と解析の後に) 正確なコンパイラ内部で作業できることです。ただし、これには多少の労力がかかります。

于 2012-01-18T12:08:36.060 に答える