19

しばらく前から大規模なコードベースがあり、リファクタリングして少し整理しようとしています。私がやりたいことの 1 つは、ヘッダー ファイル全体を含めるのではなく、メンバーを転送宣言できるすべてのヘッダーを見つけることです。

これはかなり手間のかかるプロセスであり、どのヘッダーに前方宣言可能なメンバーがあるかを判断するのに役立つツールを探しています。

次のコードが前方宣言を使用できるという警告または提案を発行できるコンパイラ設定はありますか? 次のコンパイラ icc、gcc、sun studio、および HP の aCC を使用しています。

同じ仕事をすることができるスタンドアロンのツールはありますか?

#include "Foo.h"
...//more includes

class Bar {
.......
private:
    Foo* m_foo;
};
4

3 に答える 3

5

C++ の正確な分析を含むものは、基本的にどこかに完全な C++ フロント エンドを必要とします (そうしないと、答えが得られないか、間違っている可能性があり、「大規模な」アプリケーションではうまく機能しません)。ここで利用できる実用的な答えはあまりありません。

既に述べたように、GCCXML は GCC から派生したパッケージであるため、必要な C++ フロント エンドが含まれています。XMLを生成するため、別の回答で提案されている「メモリ内データ構造」を形成するために読み返す必要がある大量の出力が生成されます。残念なことに、GCCXML は既にそのメモリ データ構造を構築してから、それを XML としてエクスポートし、再度構築する必要があります。もちろん、メモリ内のデータ構造を構築する GCC を使用することもできますが、GCC をハックして必要なものにする必要があり、実際にはコンパイラになりたいと考えています。つまり、それを自分の意志に曲げるために、自分の手で戦いを繰り広げることになります (そして、GCCXML が存在する理由を説明します。ほとんどの人はその戦いを望んでいません)。

Edison Design Group C++ (EDG) フロント エンドについては言及されていません。これはメモリ データ構造に直接構築されます。これはフロントエンドです。すべての分析作業を自分で行う必要がありますが、タスクは十分に単純であるため、難しくはありません。

私が知っている最後の解決策は私のものです: C++ FrontEnd for DMS。DMS はプログラム分析を構築するための基盤であり、その C++ フロントエンドは C++ の完全なフロント エンドです (たとえば、解析、ツリー構築、名前/型解決など、GCC および Edison フロント エンドが行うすべてのことを行います)。また、DMS によって生成された「メモリ内」のデータ構造を調べて、GCCXML および EDG の場合と同様に特別な分析をコーディングする必要があります。

実際に異なるのは、DMS を使用してメモリ データ構造内のソース コードを更新することで実際にソース コードを変更し、元のコメントを含むメモリ構造からコンパイル可能なコードを再生成できることです。

于 2010-02-19T17:15:26.020 に答える
3

あなたができることは-MMでgccを呼び出すことです。これにより、Makeが読み取ることができる依存関係ファイルが生成されます。それらを使用する代わりに、それらを(perlなどで)解析して、どのインクルードが必要で、どのインクルードを前方宣言に置き換えることができるかを判断できます。

于 2010-02-19T22:02:22.883 に答える
3

これをすぐに実行できるものが見つかるかどうかはわかりませんが、1 つのオプションは、Python とpygccxmlパッケージを使用して、この分析の一部を実行できるスクリプトを作成することです。

基本的に、pygccxml を使用してソース コードのインメモリ グラフを作成し、それを使用してクラスと関数をクエリし、機能するために実際に含める必要があるものを見つけます。

したがって、たとえば、各クラスに質問して、ポインター型のメンバーを教えてください。次に、これらのポインター型のそれぞれについて、クラスの実際のインスタンス (非ポインター) がインターフェイスで使用されているかどうかを判断できます。前方宣言の候補としてマークできます。

欠点は、スクリプトが正しくなるまでに時間がかかるため、コストがメリットを上回る可能性があることですが、少なくとも興味深い演習になるでしょう。機能するものがあれば、Github にコードを投稿して、他の人がそれを役に立つと思うかもしれません。

于 2010-02-19T16:40:27.630 に答える