私は現在、問題、そのステートメントに取り組んでいます - .CPPファイル内の宣言されたすべてのグローバル変数のリストを含むテキストファイルを生成します。C++ソースファイルからグローバル変数のリストを作成
私は最初の1、いくつかのアイデアを思い付いた: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からの.cppソースファイルのファイル名を取得します.txt、グローバル変数(constを無視する)をスキャンし、 "filename [変数のリスト]のレポートを書く。 私が遭遇した主な問題は、ctagsがSTL型のいくつかのケースでは非常に奇妙な無視をするということです。
Eg it除外することができます行ike "ベクトル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 [email protected]@GLIBCXX_3.4 <- (!)
0000000000603579 B [email protected]@GLIBCXX_3.4 <- (!)
0000000000603748 B t
そして今、私はどのように考えています任意の.cppソースファイルから宣言されたグローバル変数のリストに関する正しい情報を受け取るために、これらのメソッドの1つを実装する。私はこの問題の提案を聞いてうれしいです。
C++は構文解析が難しいため、ctagsのような外部ツールを使用する必要があります。しかし、 'const'のためのseddingは、const globalを無視して、どこにでも置くことはできません。constへの非constポインタ、または 'constant'のような名前さえできます。 – Kos
確かに、私は正規表現を埋め込むことに同意します、それは一種の純粋な解決策でした。 – Twd1024
あなたは完全なASTを与えることができる良いC + +パーサで家にいるでしょう。 Eclipse CDTにはまともなパーサがありますが、スタンドアロンで動作するようには設計されていません(私を逃れてしまう理由で)。それを使用するには、Eclipseプラグインを作成する必要があります。私はGCCまたはClangの内部を使ってASTを生成することがどれほど難しいだろうかと疑問に思っています – Kos