Visual Studio での C++ コードの編集とリファクター

Visual Studio には、コードの作成、編集、リファクターに役立つ複数のツールが用意されています。

IntelliSense

IntelliSense は、入力時にシンボルとコード スニペットの候補を示す強力なコード補完ツールです。 Visual Studio では C++ IntelliSense はリアルタイムで実行され、コードベースの更新時に分析を行い、レコメンデーションを提供します。 文字を多く入力するほど、推奨される結果のリストが絞り込まれます。

文字列に使用できるメソッド (append、assign など) を示す、C++ のメンバー リスト ドロップダウンのスクリーンショット。

シンボルの中には、結果を絞り込むために自動的に省略されるものもあります。 たとえば、クラスの外部からクラス オブジェクトのメンバーにアクセスすると、既定ではプライベート メンバーを表示したり、子クラスのコンテキストではない場合は、保護されたメンバーを表示することができなくなります。 下部にあるボタンを使用してフィルター処理を調整することができます。

ドロップダウン リストからシンボルを選択すると、Tab キー、Enter キー、または他のコミット文字 (既定: { } [ ] ( ) . , : ; + - * / % & | ^ ! = ? @ # \) のいずれかでオートコンプリートできます。 このリストから文字を追加または削除するには、クイック起動 (Ctrl + Q) で "IntelliSense" を検索し、[テキスト エディター] > [C/C++] > [詳細設定] オプションを選択します。 [メンバー一覧のコミット文字] オプションを使用すると、好きなように変更してリストをカスタマイズすることができます。

[メンバー一覧のフィルター モード] オプションは、表示される IntelliSense オートコンプリートの候補の種類を制御します。 既定では [あいまい] に設定されています。 あいまい検索では、MyAwesomeClass と呼ばれるシンボルがある場合、「MAC」と入力して、オートコンプリートの候補の中からクラスを検索できます。 あいまいアルゴリズムにより、リストに表示するシンボルが満たす必要がある最小しきい値が設定されます。 スマート フィルター処理では、入力内容に一致する部分文字列を含むすべてのシンボルが表示されます。 プレフィックス フィルター処理では、入力内容で始まる文字列が検索されます。

C++ IntelliSense の詳細については、「Visual C++ IntelliSense の機能」と「IntelliSense の C++ プロジェクトを構成する」を参照してください。

IntelliCode

IntelliCode は、AI 支援 IntelliSense です。 入力候補一覧の先頭に最も可能性が高い候補が配置されます。 IntelliCode レコメンデーションは、GitHub に存在する、それぞれ 100 個以上の星が付いた数千のオープンソース プロジェクトに基づいています。 ご使用のコードのコンテキストと組み合わせると、よくある方法を促進するように入力候補一覧が調整されます。

C++ を記述するときに、IntelliCode は C++ 標準ライブラリのような一般的なライブラリの使用に際して支援を行います。 コードのコンテキストは、最初に最も役に立つレコメンデーションを提供するために使用されます。 次の例では、size メンバー関数は sort 関数とよく併用されるため、結果リストの先頭に表示されます。

コードで最もよく使われる順に並べられた vector クラスのメンバーを示す、C ++ の IntelliCode ドロップダウンのスクリーンショット。

Visual Studio 2022 と Visual Studio 2019 では、IntelliCode は省略可能なコンポーネントとして C++ によるデスクトップ開発ワークロードで使用できます。 IntelliCode を C++ に対してアクティブにするには、 [ツール]>[オプション]>[IntelliCode]>[全般] の順に移動して、 [C++ 基本モデル][有効] に設定します。

Visual Studio 2017 では、IntelliCode は Visual Studio Marketplace で拡張機能として利用できます。

予測 IntelliSense (試験段階)

予測 IntelliSense は、コンテキストの認識を使用して IntelliSense ドロップダウン リストに表示される結果の数を制限する試験段階の機能です。 このアルゴリズムは、予測される入力に一致する結果のみが表示されるように、一致する入力に適用されます。 最も簡単なケースでは、「int x =」と入力して IntelliSense ドロップダウン リストを呼び出すと、整数または整数を返す関数のみが表示されます。 この機能はまだ開発段階のため、既定でオフになっています。 これはグローバル シンボルで最適に機能します。メンバー関数はまだサポートされていません。 オンにするには、クイック起動で「予測」と入力するか、 [ツール]>[オプション]>[テキスト エディター]>[C/C++]>[試験的]>[予測 IntelliSense] の順に移動します。

予測 IntelliSense をオーバーライドして長いリストを表示するには、Ctrl + J を押します。予測 IntelliSense がオンになっている場合に、Ctrl + J を呼び出すと、予測フィルターが削除されます。 Ctrl + J をもう一度押すと、該当するメンバー一覧の結果からアクセシビリティ フィルターが削除されます。 IntelliSense ドリップダウン リストの下にある [+] ボタンは、Ctrl + J と同じことを行います。ボタンをポイントすると、表示されている内容についてのツールヒント情報が表示されます。

C++ 予測 IntelliSense のスクリーンショット。

上のスクリーンショットには、ドロップダウン リストの下にいくつかのボタンが表示されています。 これらは、さまざまな種類の結果に対して IntelliSense フィルターを有効にします。

  • 変数と定数
  • 関数
  • [マクロ]
  • 列挙体
  • 名前空間

ボタンは、現在の IntelliSense セッションに関連がある場合にのみ表示されます。 通常は同時にすべてのボタンは表示されません。

テンプレート IntelliSense

テンプレート バーは、カーソルがテンプレート定義上にあるときに表示される UI 要素です。 テンプレートの本体を編集するときに表示されるサンプル テンプレート引数を IntelliSense に対して提供できるため、便利です。 たとえば、テンプレート引数が std::vector<int> 型であることを指定できます。 その後、テンプレート本文でその引数を使うと、IntelliSense に std::vector<int> のメンバーが表示されます。

[既存のインスタンス化をすべて追加する] オプションが強調表示されているテンプレート バーのスクリーンショット。

テンプレート バーを展開するか折りたたむには、<T> アイコンをクリックします。 鉛筆アイコンをクリックするか、テンプレート バーをダブルクリックして編集ウィンドウを開き、パラメーターの引数の型を指定します。

各テンプレート パラメーターの型を入力する、テンプレート バー内の編集エクスペリエンスのスクリーンショット。

テンプレート バーでは、コード内のテンプレートのインスタンス化に基づいて、パラメーターの型を自動的に設定できます。 [既存のインスタンス化をすべて追加する] をクリックして、コード ベース全体でテンプレートのインスタンス化に使用されているすべての具体的な引数のリストを表示します。

エディターの下部にあるウィンドウには、各インスタンスが検出された場所とその引数が何であったかが表示されます。 インスタンス化を選んで、そのインスタンス化が見つかったコード内の場所に移動できます。

コード内のテンプレートのインスタンス化の一覧のスクリーンショット。インスタント化、ファイル、場所、引数が一覧表示されています。

テンプレート バーの情報は、ユーザー固有です。 .vs フォルダーに格納され、ソース管理にはコミットされません。

エラーの波線とクイック修正

エディターでコードの問題が検出されると、問題の下に色付きの波線が追加されます。 赤い波線はコードがコンパイルされないことを示します。 緑の波線は、重大な影響を及ぼす可能性があるその他の問題の種類を示します。 [エラー一覧] ウィンドウを開いて問題に関する詳細情報を得ることができます。

一部のエラーの種類と、一般的なコーディング パターンに対しては、エディターでクイック修正が提供されます。これは波線をポイントしたときに表示される電球の形で提供されます。 解決策を表示するには、下矢印をクリックします。

次の例では、vector が宣言されましたが、定義が見つからなかったため、エディターによって含める必要があるヘッダー ファイルが提供されます。

エラーと提案された

エディターでは、いくつかのリファクタリングの機会のためのクイック修正も提供されます。 たとえば、ヘッダー ファイルでクラスを宣言すると、Visual Studio により別の .cpp ファイルでその定義を作成することが提案されます。

[Create definition of Channel Route Iterator in channels.cpp]\(channels.cpp の ChannelRouteIterator の定義を作成\) オプションが強調表示されているクイック修正を示すスクリーンショット。

Change tracking

ファイルに変更を加えると、左側に黄色のバーが表示され、未保存の変更が行われたことが示されます。 ファイルを保存すると、バーが緑色に変わります。 ドキュメントがエディターで開かれている限り、緑色と黄色のバーは保持されます。 これらは、ドキュメントを最後に開いてから加えられた変更を表します。

C++ の変更追跡のスクリーンショット。左側に変更を示す黄色のバーが表示されます。

コードの移動

コード行を上下に移動するには、そのコード行を選択し、Alt キーを押しながら、上方向/下方向キーを押します。

スニペットの挿入

スニペットは、定義済みのソース コードです。 単一のポイントまたは選択したテキストを右クリックして、[スニペット] を選び、スニペットを挿入するか、選択したテキストをスニペットで囲みます。 次の図は、for ループで選択したステートメントを囲む 3 つの手順を示します。 最終的なイメージの黄色のハイライトは、Tab キーでアクセスできる編集可能なフィールドです。 詳細については、「Code Snippets」を参照してください。

[スニペットの挿入] ドロップダウン コントロールのスクリーンショット。

関数が選択されています。 関数名を右クリックすると表示されるドロップダウンで、[ブロックの挿入...] が黄色で強調されています。 [ブロックの挿入:] ドロップダウンで、"for" ループのスニペットが選択されています。 これにより、関数を囲んで for ループが配置されます。 ループ変数と制限は黄色で表示され、編集可能なフィールドであることを示しています。

クラスの追加

[プロジェクト] メニューから、またはソリューション エクスプローラーのコンテキスト メニューから新しいクラスを追加します。

[新しいクラスの追加] ダイアログのスクリーンショット。クラス名、アクセシビリティ、宣言と実装を配置するファイルなどのフィールドがあります。

クラス ウィザードを使用して、既存のクラスを変更したり、調べたりすることもできます。

メソッド、メンバー変数などを追加するためのオプションがあるクラス ウィザードのスクリーンショット。

詳細については、「コード ウィザードを使用した機能の追加 (C++)」を参照してください。

リファクタリング

クイック操作のコンテキスト メニューから、またはエディターの電球をクリックすることで、リファクタリングが利用できます。 [編集] > [リファクター] メニューから利用できるものもあります。 これには次の機能があります。

ClangFormat と EditorConfig を使用したコード スタイルの適用

Visual Studio 2017 以降では、ClangFormat (Clang/LLVM に基づいた C++ 用の一般的なコード書式設定ユーティリティ) の組み込みサポートが付属しています。 クイック起動に「ClangFormat」と入力して、次の一般的な形式のいずれかを使用するように設定します。

  • LLVM
  • Google
  • Chromium
  • Mozilla
  • WebKit
  • Visual Studio

独自の .clang-format または _clang-format ファイルを指定して、同じレベル以下のすべてのコード ファイルにカスタム ルールを適用することもできます。

ファイルは、ソース管理を通じて簡単に共有できるため、開発チーム全体にコーディング規則を適用することができます。

列の制限、インデントの幅、タブの幅など、多くのオプションがある .clang-format ファイルを示すスクリーンショット。

Visual Studio 2017 以降では、同様の方法で機能する EditorConfig もサポートしています。 ただし、ClangFormat には、C++ 固有のルールなど、EditorConfig よりも多くのスタイル オプションがあります。 EditorConfig を使用して、 .editorconfig ファイルを作成し、それをご使用のコードベースとは別のフォルダーに配置して、これらのフォルダーとそのサブフォルダーにコード スタイルを指定します。 .editorconfig ファイルは、親フォルダー内の他の .editorconfig ファイルよりも優先され、 [ツール]>[オプション] から構成されたすべての書式設定を上書きします。 タブと空白、インデントのサイズなどにルールを設定することができます。 詳細については、「EditorConfig で移植可能なカスタム エディター設定を作成する」を参照してください。

その他の書式設定オプション

クイック起動検索ボックスには、設定やツールを検索する最も簡単な方法が用意されています。 これはメイン メニューにあります。 入力を開始するだけで、オートコンプリート リストにより結果がフィルター処理されます。

クイック起動の検索ボックスのスクリーンショット。

インデント、中かっこの補完、色付けなどの書式設定オプションを設定するには、 [クイック起動] ウィンドウに「C++ Formatting」と入力します。

タブを入力したら自動的にインデントするかどうか、などの C++ の書式設定オプションを示すスクリーンショット。

他の書式設定オプションは、メイン メニューの [編集]>[詳細設定] で見つかります。

空白の表示、単語の折り返し、選択範囲のコメント、行のインデントの増加など、高度な編集オプションを示すスクリーンショット。

C++ 固有の編集機能の有効化と構成のオプションは、 [ツール]>[オプション]>[テキスト エディター]>[C/C++] にあります。 設定するオプションを選択した後、ダイアログにフォーカスがあるときに F1 キーを押すと、詳細なヘルプを表示できます。 コードの一般的な書式設定オプションを確認するには、 [クイック起動] に「Editor C++」と入力します。

Visual Studio のメニュー項目 [ツール] が選択され、[オプション] メニュー項目が強調されているスクリーンショット。

将来のバージョンの Visual Studio に含まれる場合とそうでない場合がある実験用の機能は、[テキスト エディター]、[C++]、[実験用] ダイアログにあります。 Visual Studio 2017 以降では、このダイアログで予測 IntelliSense を有効にすることができます。

関連項目

C++ コードの読み取りと理解
Visual Studio で C++ コード間を移動する
Live Share for C++ を使用しての共同作業