インクルードの分析
インクルードの巨大な階層によって引き起こされる長いビルド時間は、実際の大規模なC++プロジェクトにおける最大の問題の1つです。ReSharperには、設計時のインクルードの最適化に役立ついくつかの機能があります。例: 未使用の #include
ディレクティブをマークするか、必要な宣言にヘッダーを含める代わりに、未解決の名前の前方宣言を自動的に作成します。
階層的な問題をより体系的に解決するために、ReSharperは不要なヘッダーの依存関係を見つけて排除するコードインスペクションツールアナライザを含むを提供しています。
どのように役立つのですか?
典型的なプロジェクトには、何千もの #include
ディレクティブが含まれている可能性があり、調査の価値があるのは明らかではありません。コンパイラのワークロード全体に加算するコード行数に基づいて、各ヘッダーファイルのビルド時間に対する寄与を推定するAnalyzerの試みが含まれます。これは正確なメトリックではありませんが、インクルードされているヘッダーファイルを見つけて優先順位を付けると便利な出発点です。
潜在的に最も大きなインパクトを持つヘッダーの依存関係を特定したら、標準的な方法で1つずつ取り除くことができます。たとえば、次のようにします。
可能な限り前方宣言(英語)を使用し
不要な
#include
ディレクティブを削除Pimplイディオムを適用
大きなヘッダーファイルを小さなヘッダーファイルに分割します。
Includes Analyzerの重要な制限の1つは、分析プロセスを高速化するためにReSharperが実際には完全な前処理段階を実行していないことです。つまり、行数に実際にマクロ展開の結果は含まれず、ガードを含むガードも処理されません。代わりに、ReSharperは各ヘッダファイルがインクルードガードまたは#pragma onceディレクティブで始まり、ソースファイルに最大で1回含まれると仮定します。同じヘッダーを連続してインクルードすると、それが貢献した行の数には数えられません。つまり、内部ツリーノードの隣にある時が含まれてやその他のメトリックがゼロになることがあります。
分析の開始
分析を開始するには、メインメニューからIncludesを分析するを選択します。
アクションの1つを呼び出します。または、ソリューションエクスプローラーのコンテキストメニューからReSharperは、指定されたスコープ内のファイルを分析し、ファイル間の依存関係を調べる専用ツールウィンドウにレポートを表示します。分析を含むウィンドウには、2つのビューインクルードとインクルードがあります。どちらも、各ノードがファイルに対応するツリーとして依存関係を含んでいます。対応するツールバーボタンを使用するか、コンテキストメニューから別のビューの同じファイルに移動して、これらのビューを切り替えることができます。
Includeesビュー
インクルードビューは、トップレベルのツリーノードのヘッダーファイルが直接的または間接的にそれを含むすべてのソースファイルに寄与するコードの行数を理解できます。このビュー内の子ノードは、親ノードからのファイルを含むファイルを表します。Catch2(英語)ソリューション全体の以下の分析を検討してください。

ツリー内の各ノードには3つのメトリックがあります。
時が含まれては、現在のノードへのパスを介して最上位ノードにヘッダーを含むソースファイルの数を示します。上記の例では、catch_common.h は合計75個のソースファイルに含まれていましたが、そのうち26個は catch_tag_alias_autoregistrar.hの
#include "catch_common.h"
ディレクティブを通じて catch_common.h を含んでいました。ラインの寄与は、最上位ノードのヘッダーが、推移的にインクルードされたファイルなしで、それ自体で現在のノードへのパスを介して貢献したコードの行数を示します。 catch_common.h は合計で4,050行のコードを提供しました。これは75(それを含むソースファイルの数)×54(ファイル内のコードの行数)です。 catch_tag_alias_autoregistrar.hには
#include "catch_common.h"
が含まれているため、合計4,050本のうち1,404本が提供されます。ライン貢献度はラインの寄与に似ていますが、このメトリックは、トップレベルノードのファイルに推移的に含まれるすべてのヘッダーを考慮に入れます。たとえば、catch_common.hは、それに含まれるヘッダーとともに、ソリューション全体のコンパイル中に2,654,938行に貢献します。これらの行の1,017,626は、
catch_tag_alias_autoregistrar.h
の#include "catch_common.h"
のために提供されます。ライン貢献度はデフォルトであり、おそらく最も有用なソート基準です。
インクルードビュー
インクルードビューはインクルードビューに似ていますが、逆の方法で動作します。ツリー内の子ノードは、親ノードからファイルに含まれるファイルを表します。

このビューは、スタンドアロンソースファイルとしてコンパイルされたかのように、トップレベルノードのファイルに推移的に含まれるコードの行数を示します(たとえば、catch_common.h とそれに含まれるすべてのヘッダーは、42,365のコード行で構成され、そのうち27,046 #include<string>)
で提供されました。このビューが提供するメトリックは次のとおりです。
インクルードカウント(インクルードファイル数)
行数(ファイル自体のサイズ)
行数(それに含まれるすべてのヘッダーファイルを含むファイルのサイズ)
オプション
ナビゲーションコントロールとリフレッシュボタンに加えて、Includes分析ウィンドウのツールバーでは、次の2つのオプションを変更できます。
プロジェクトに属するルートノードのみを表示するは、どのプロジェクトにも属さないファイルに対応する最上位のツリーノードを非表示にします。これは、ソリューション内のヘッダーにのみ集中したい場合に、ライブラリーファイルをフィルタする素早い方法です。
デフォルトでは、解析中にReSharperは空白行とコメントをスキップします。空白行とコメント行をカウントするボタンを使用すると、この動作を変更できます。
関連ページ:

C++のコードインスペクションとクイックフィックス
C++のサポートは、ReSharper C++(ReSharperと一緒に、またはReSharper Ultimateと別々にまたは並行してインストールできる)の専用製品で使用できます。ReSharperのコード解析の主な機能は、C++でもサポートされています。これらの機能の詳細については、コード解...

C++でのナビゲーションと検索
C++のサポートは、ReSharper C++(ReSharperと一緒に、またはReSharper Ultimateと別々にまたは並行してインストールできる)の専用製品で使用できます。名前によるナビゲーション:ReSharperを使用すると、いくつかのキーストロークで任意のコードアイテムまたはファ...

C++のリファクタリング
C++のサポートは、ReSharper C++(ReSharperと一緒に、またはReSharper Ultimateと別々にまたは並行してインストールできる)の専用製品で使用できます。リファクタリングに加えて、ReSharperはコンテキスト・アクションで利用可能ないくつかの小さなローカルコード変...