ReSharper 2024.1 ヘルプ

C++ でのコード分析

ReSharper のコード解析の主な機能は、C++ でもサポートされています。これらの機能の詳細については、コード解析の該当するトピックを参照してください。このセクションのサブジェクトでは、フィーチャマトリックスを見つけて、C++ で正確にサポートされているものを確認することもできます。

このトピックでは、C++ でコード解析機能を使用する例をいくつか見てみましょう。

デフォルトでは、コードインスペクションクイックフィックスコンテキストアクションはすべてのソリューションファイルで使用できます。必要に応じて、ReSharper オプション Alt+R, Oコード編集 | C++ | インスペクションページのソリューション外部のファイルでインスペクション、クイックフィックス、コンテキストアクションを有効にするチェックボックスを使用して、ソリューションから参照される外部ファイルでこれらの機能を有効にすることができます。

コードインスペクション

ReSharper の静的コード分析は、C++ ファイル内のほとんどのコンパイラーエラーと一部のコンパイラー警告を検出します。

さらに、実行時に見つかる他のコードの問題も検出します。例: コンストラクターで仮想メソッドを使用すると、この StackOverflow の質問(英語)で説明したように予期しない動作が発生します。ReSharper は、コンパイルする前にこの問題を指摘しています。

ReSharper warning. virtual method in constructor

分析は、コードインスペクション現在の文書または指定された範囲に適用することによって実行されます

Code inspection results in a C++ project

インスペクション ReSharper が提供するコードの種類を調べるには、ReSharper C++ コードインスペクションの完全なリストを調べましょう。

コードインスペクションの詳細については、「コードインスペクション設定を構成する」を参照してください。

特定のインスペクションをすばやくオフにするか、すべてのインスペクションを非表示にするには、インスペクションコンテキストメニューを使用します。

Disable inspections in C++

ReSharper 固有の属性を使用して一部のインスペクションを抑制することもできます。詳細については、属性を使用してインスペクションを調整するセクションを参照してください。

クイックフィックス

クイックフィックスを使用すると、コードインスペクションで見つかったコードの問題のほとんどを自動的に解決することができます。コードの問題に対して 1 つ以上のクイックフィックスが利用可能な場合は、キャレットがハイライトされたコード上にあるときに対応するアクションインジケータが表示されます。目的の修正を確認して適用するには、Alt+Enter を押します。

ReSharper は、C++ に 290 を超えるクイックフィックスを提供します。ここではいくつかの例を示します。

不足している #include ディレクティブを追加する

標準ライブラリまたはソリューションの他の場所で定義されているシンボルを使用する場合、ReSharper は、欠落している #include ディレクティブを自動的に追加できます。

ReSharper: helps adding missing C++ includes automatically

ReSharper オプション Alt+R, Oコード編集 | C++ | インスペクションページにあるインポートアクションのポップアップを表示するチェックボックスを使用して、ポップアップを無効にすることができます。

チェックボックスが選択されていない場合、Alt+Enter を押すと、対応するアクションがアクションリストで使用可能になります。

前方宣言を追加する

ReSharper は、未解決のシンボルの前方宣言も生成できます。

ReSharper: Add forward declaration quick-fix

[[maybe_unused]] を追加

[[maybe_unused]] 属性を追加して、未使用の名前またはエンティティに関するコンパイラーからの警告を回避できます。キャレットが未使用のエンティティ上にある場合、次のクイックフィックスが利用可能になります:

Add [[maybe_unused]]

また、別のコンテキストアクションは、UNREFERENCED_PARAMETER および Q_UNUSED の使用を [[maybe_unused]] 属性に置き換えるのに役立ちます。

add [[maybe_unused]]

キャプチャーリストに追加

ローカル変数がラムダ本体の内部で使用されているが、このラムダによってキャプチャーされていない場合、ReSharper はキャプチャーリストを更新するためのクイックフィックスを提案します。値または参照によって変数または this をキャプチャーするか、使用されているすべての自動変数を暗黙的にキャプチャーできます。

ReSharper C++: quick-fix to update the capture list

戻り値の型を変更する

関数の戻り値の型が実際に返す値と一致しない場合、ReSharper を使用すると、戻り値の型をすばやく修正できます。

ReSharper helps fixing types of variables and fields

変数型の変更

変数またはフィールドの指定された型が割り当てられた値と一致しない場合、ReSharper は宣言で正しい型を使用するためのクイックフィックスを提供します。

ReSharper helps fixing types of variables and fields

宣言を作成する

C++ ファイルのメンバー関数のヘッダーファイルに宣言がない場合、ReSharper は実装のシグネチャーに従って欠落している宣言を作成できます。

Generating declaration for C++ class member

使用箇所から作成

宣言されていないシンボルを使用する場合、ReSharper は、使用箇所に基づいてシンボルを作成するための 1 つ以上のクイックフィックスを提案します。

Generating C++ field from usage

メンバーを初期化する

ReSharper が初期化されていない型メンバーを検出した場合は、1 回の修正ですべてのメンバーを初期化することをお勧めします。この修正プログラムのサブメニューを使用して、特定のメンバーの初期化を生成することもできます。

ReSharper C++: quick-fix to initialize members

変数の初期化

ReSharper は、初期化されていない変数を検出し、デフォルト値で初期化できます。

ReSharper helps initialize variables in C++

未使用の #include ディレクティブを削除する

未使用の #include はすべてハイライト表示され、クイックフィックスで簡単に削除できます:

Removing unused #include directives

未使用のラムダキャプチャーを削除する

ローカル変数がラムダによってキャプチャーされてもラムダ本体内で使用されない場合、ReSharper は通知し、未使用のキャプチャーを削除するように提案します。

Remove unused lambda capture

ドット(.)を矢印(- >)に置き換えます。逆も同様です

ドット . 演算子が誤ってポインターに適用された場合、ReSharper はそれを矢印 -> 演算子に置き換えるのに役立ちます。

ReSharper helps replacing the dot operator with arrow

逆のクイックフィックスも利用できます:

ReSharper helps replacing the arrow operator with the dot

ラムダで明示的なテンプレートパラメーターを使用する

ReSharper は、ラムダが新しい C++20 テンプレート構文を使用するように書き換えられる時期を検出します。

Use explicit template parameters in lambda

パラメーターの型が右辺値参照の場合、その型を直接 std::forward に渡すことができます。この場合、使い慣れた完全な転送構文を使用できます。

perfect forwarding syntax

static_cast を使用

ReSharper は、static_cast を好むべきケースを検出し、コードの更新を支援します。

  • C++ キャストの代わりに使用される関数型のキャスト:

    Functional-style cast used instead of a C++ cast
  • void* にキャストするときに、static_cast の代わりに reinterpret_cast が使用されます。

    reinterpret_cast used instead of a static_cast when casting to void*

属性を使用してインスペクションを調整する

ReSharper 固有の属性をソースコードのシンボルに追加して、ReSharper がソリューションをより高い精度とインサイトで分析できるようにすることができます。ReSharper では、カスタム属性 [[jetbrains::format]][[jetbrains::guard]][jetbrains::pass_by_value]][[jetbrains::has_side_effects]] を使用できます。

[[jetbrains::format]] 属性を使用すると、カスタム printf -like 関数の形式インスペクションを有効にすることができ、[[gnu::format]] と同様に機能します。

[[jetbrains::format]]

[[jetbrains::pass_by_value]] 属性を使用すると、「定数参照による値の受け渡し」インスペクションを抑制できます。コメントでインスペクションを無効にする代わりに抑制属性を使用するのはなぜですか ? 特定のクラスまたは構造体に対する警告を表示したくない場合は、いつでも Alt+Enter メニューからインスペクション: … | コメントで一度無効にするを選択して、現在の行またはファイルにインスペクションを抑制するコメントを追加できます。次に、すべてのクラスの使用に対しても抑制コメントを追加する必要があります。このような場合、クラス宣言で抑制属性を 1 回指定する方がはるかに簡単です。

[[jetbrains::pass_by_value]]

[[jetbrains::guard]] 属性を使用すると、「ローカル変数は使用されない」インスペクションを抑制できます。クラスにこの属性をマークすると、そのクラスがコンストラクターで重要な作業を実行することを ReSharper に知らせます。

template<class Mutex> class [[jetbrains::guard]] my_lock_guard { explicit my_lock_guard(Mutex &); };

[[jetbrains::has_side_effects]] 属性を使用すると、operator= に副作用があるとしてマークを付け、「割り当てられた値は使用されない」インスペクションを抑制できます。

struct A { A& operator = (int); [[jetbrains::has_side_effects]] A& operator = (float); }; void foo(A a) { a = 3; // warning "Assigned value is never used" a = 3.f; // no warnings here a = A(); // warning "Assigned value is never used" }

ReSharper 属性を外部ライブラリからライブラリクラスに適用する必要がある場合は、代わりに前方クラス宣言でその属性を使用できます: class [[jetbrains::pass_by_value]] my_class;

コンパイラーが不明な属性に関する警告を表示した場合は、__JETBRAINS_IDE__ マクロまたは __RESHARPER__ マクロを使用して宣言を保護できます。

#ifdef __JETBRAINS_IDE__ class [[jetbrains::pass_by_value]] my_class; #endif

ReSharper に特定のコードを無視させる

ソリューションのコードの一部をコード分析、ナビゲーション、その他の機能から除外するために、ReSharper では特定のファイル、フォルダー、ファイルマスクをさまざまな方法で無視するを使用できます。

関連ページ:

コード解析

ReSharper は、エディター内の単一のステートメントから、ソリューション全体のアーキテクチャまで、さまざまなレベルのコードを分析できます。コードの問題を見つける:ReSharper は、C#、VB.NET、XAML、XML、ASP.NET、ASP.NET MVC、Razor、JavaScript、TypeScript、HTML、CSS、ResX で 2500 を超えるコードインスペクションを適用することにより、静的コード分析(コードインスペクションとも呼ばれます)を提供します。スクリプト...

C++ のコーディングアシスタンス

ReSharper のコーディング支援機能のほとんどは C++ でもサポートされています。これらの機能の詳細については、コーディング支援セクションの対応するトピックを参照してください。このセクションの主なトピックでは、機能マトリックスを見つけて、C++ で何がサポートされているのかを確認することもできます。このトピックでは、C++ のコーディング支援機能の使用例をいくつか見つけることができます。デフォルトでは、コードインスペクション、クイックフィックス、コンテキストアクションはすべてのソリューシ...

設計時にコードの問題を分析する

ReSharper は、エディターでコードファイルを開くとすぐに分析を開始し、最後まで編集を続けます。検出されたすべてのコードの問題は、重大度に従ってエディターでハイライトされます。問題のマップは、エディターウィンドウの右側のマーカーバーにも表示されます。ここでは、ファイルのステータスを即座に確認し、マークをクリックして特定のコードの問題に移動できます。デザインタイムインスペクションの機能:ReSharper によって実行されるデザインタイムコードインスペクションを説明するために、エディターに...

特定の範囲でコードの問題を見つける

設計時コードインスペクションは、エディターでコーディングしたり、特定のファイルを見直したりするときに役立ちます。ただし、ReSharper を使用すると、ソリューション全体または狭い範囲でスタティックコード分析を実行し、結果をフレンドリーな視点で調べることもできます。必要に応じてインスペクション結果を共有することもできます。開始コードインスペクション:ソリューション、プロジェクト、カスタムスコープのコードをインスペクションするソリューションワイドのインスペクションの結果(たとえば、未使用のパブ...

コードインスペクション設定を構成する

設計時コードインスペクションを構成する:デフォルトでは、ReSharper は、サポートされている言語に対応するすべてのファイルで設計時コードインスペクションを有効にします。必要に応じて、無効にすることができます。設計時コードインスペクションが有効かどうかに関係なく、コードインスペクションは常に特定のスコープで実行できます。メインメニューからを選択するか、Alt+R O を押してから、左側のを選択します。設計時コードインスペクションを切り替えるには、コード分析を有効にするチェックボックスを使用し...

アクションインジケーターとアクションリスト

ReSharper が Visual Studio テキストエディターに追加する最も注目すべきものの中には、アクションインジケータとアクションリストがあります。これらは、ReSharper でサポートされているすべてのファイル(C#、VB.NET、XML、CSS、JavaScript、ASP.NET など)に表示され、使用可能なアクションについて通知し、適用できます。アクションインジケータ:アクションインジケーターは、設定に応じて、アクションバー、テキストエディターの左マージンおよび / また...