C++ のサポート
CLion には 2 つの言語エンジン 、組み込みエンジンと Clangd ベースのエンジンの両方が並行して組み込まれています。
Clangd ベースのエンジンは、エディターで表示される警告やエラーを検出し、クイックフィックスを提供、特定のナビゲーションアクションやハイライト、補完を行います。CLion 独自のエンジンはリファクタリングなどのコードインサイト機能に使われます。 Clangd 設定で Clangd のスコープを調整できます。
次の表は、2 つのエンジンが デフォルトで CLion 機能を処理する方法を示しています。
IDE 機能 | 言語エンジン |
|---|---|
構文ハイライト | clangd |
エラー / 警告とクイックフィックス | clangd |
Clangd のみ、両方、組み込みのみ * | |
clangd | |
内蔵エンジン | |
** の両方 | |
clangd | |
内蔵エンジン |
* - Clangd 設定で選択したとおり。
** - 両方のエンジンが使用されます。 Clangd はキャレットでの参照のハイライト、 Go to declaration、 Go to definition、 クイックドキュメント、 クイック定義、 使用箇所の検索をサポートします。
言語標準への準拠
CLion は、 C++11、 C++14、 C++17 、部分的に C++20 を完全にサポートします。
C++11 および C++14 のサポートは、組み込みエンジンによって提供されます。 C++17 機能の一部もサポートしていますが、残りの機能は Clangd によって提供されます。
C++20 標準のサポートは、解析とリファクタリング (組み込みエンジンによって処理される) を除き、Clangd に依存します。 さらに、内蔵エンジンにより、Clangd の C++20 の概念サポートが拡張されます (詳細については、 専用記事を参照してください)。
以下の表に、標準サポートのステータスの概要と、C++20 および C + 17 サポートの詳細を示します。
標準 | Clangd (CXX_status(英語)) | 内蔵エンジン |
|---|---|---|
C++20、C++ 2b | 部分的なサポート |
|
C++17 | Clang 5 以降の完全サポート | 部分的なサポート |
C++14 | フルサポート | フルサポート |
C++11 | フルサポート | フルサポート |
C++ 2b
言語機能 | エラーのハイライトとクイックフィックス | 補完 | ナビゲーション | 解析 | リファクタリング | |
|---|---|---|---|---|---|---|
リテラル接尾辞 | 部分的に | - | - | - | - | - |
ラムダの | 部分的に | - | - | - | - | - |
より単純な暗黙の移動 (P2266R1(英語)) | 部分的に | - | - | - | - | - |
| - | - | - | - | - | - |
重複する属性を許可する (P2556R1(英語)) | 一部 | - | - | - | - | - |
コンテキスト変換を bool に絞り込む (P1401R5(英語)) | 一部 | - | - | - | - | - |
ラインスプライシングの前に空白をトリミングする (P2223R2(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
宣言順序のレイアウトを義務付ける (P1874R4(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
UAX31 を使用した C++ 識別子構文 (P1949R7(英語)) | 一部 | - | - | - | - | - |
混合文字列リテラルの連結 (P2201R1(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
C++20
言語機能 | エラーのハイライトとクイックフィックス | 補完 | ナビゲーション | 解析 | リファクタリング | |
|---|---|---|---|---|---|---|
ビットフィールドのデフォルトメンバー初期化子 (P0683R1(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
| + | clangd | clangd | 混合、Clangd に依存 | - | - |
ラムダキャプチャーを許可 | + | clangd | clangd | 混合、Clangd に依存 | - | - |
プリプロセッサーのコンマ省略のための | + | clangd | clangd | 混合、Clangd に依存 | - | - |
指定イニシャライザー (P0329R4(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
一般的なラムダのテンプレートパラメーターリスト (P0428R2(英語)) | + | clangd | clangd | 混合 | 内蔵エンジン | - |
概念: P0734R0(英語) P0857R0(英語) P1084R2(英語) P1141R2(英語) P1616R1(英語) P1452R2(英語) | + | clangd | clangd | 混合 | 内蔵エンジン | 組み込みエンジン、 リネームのみ |
概念: P0848R3(英語) P1972R0(英語) P1980R0(英語) P2103R0(英語) P2092R0(英語) P2113R0(英語) | - | - | - | - | - | - |
初期化子を使用した範囲ベースの for ステートメント (P0614R1(英語)) | + | clangd | clangd | 混合 | 内蔵エンジン | 内蔵エンジン |
表示されない ADL および関数テンプレート (P0846R0(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
| + | clangd | clangd | 混合、Clangd に依存 | - | - |
一貫した比較 ( | + | clangd | clangd | 混合 | 内蔵エンジン | - |
一貫した比較 ( | 一部 | - | - | - | - | - |
一貫した比較 ( | - | - | - | - | - | - |
専門分野のアクセスチェック (P0692R1(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
デフォルトの構築可能で割り当て可能なステートレスラムダ (P0624R2(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
評価されていないコンテキストのラムダ (P0315R4(英語)) | 部分的に ( | clangd | clangd | 混合、Clangd に依存 | - | - |
| + | clangd | clangd | 混合 | 内蔵エンジン | - |
| + | 内蔵エンジン | 内蔵エンジン | 内蔵エンジン | 内蔵エンジン | - |
typename は他のコンテキストではオプション (P0634R3(英語)) | - | - | - | - | - | - |
ラムダ初期キャプチャーのパック拡張 (P0780R2(英語)) | + | clangd | clangd | 混合 | 内蔵エンジン | - |
非型テンプレートパラメーターとしてのクラス型(P0732R2(英語)、 P1907R1(英語) | 一部 | clangd | Clang | - | - | - |
オペレーター削除の破棄 (P0722R3(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
constexpr 制限の緩和 (P1064R0(英語), P1002R1(英語), P1327R1(英語), P1330R0(英語), P1331R2(英語), P1668R1(英語), P0784R7(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
ユーザーが宣言したコンストラクターで集計を禁止する (P1008R1(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
機能テストマクロ (P0941R2(英語)) | clangd | clangd | 混合、Clangd に依存 | - | - | |
| + | clangd | clangd | 混合 | 内蔵エンジン | 内蔵エンジン |
符号付き整数は 2 の補数です (P1236R1(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
| + | clangd | clangd | 混合 | 内蔵エンジン | - |
即時機能 ( | + | clangd | clangd | 混合 | 内蔵エンジン | - |
| + | clangd | clangd | 混合、Clangd に依存 | - | - |
ネストされたインライン名前空間 (P1094R2(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
構造化バインディング拡張 (P1091R3(英語), P1381R1(英語)) | 部分的に | - | - | - | - | - |
より強力な Unicode 要件 (P1041R4(英語), P1139R2(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
集計の括弧で囲まれた初期化 (P0960R3(英語), P1975R0(英語)) | - | - | - | - | - | - |
モジュール: P1766R1(英語) (DR(英語)), P1779R3(英語) | + | clangd | clangd | clangd | clangd | clangd |
モジュール: (P1874R1(英語)), P2115R0(英語), P1103R3(英語), P1815R2(英語) | 部分的に | - | - | - | - | - |
モジュール: P1979R0(英語), P1857R3(英語), P1811R0(英語), P1703R1(英語) | - | - | - | - | - | - |
コルーチン (P0912R5(英語)) | 部分的に | clangd | clangd | 混合 | 内蔵エンジン | - |
| + | clangd | clangd | 混合、Clangd に依存 | - | - |
問題のある | + | clangd | clangd | 混合、Clangd に依存 | - | - |
| + | clangd | clangd | 混合、Clangd に依存 | - | - |
| + | clangd | clangd | 混合、Clangd に依存 | - | - |
集計のクラステンプレート引数の控除 (P1816R0(英語), P2082R1(英語)) | - | - | - | - | - | - |
エイリアステンプレートのクラステンプレート引数の控除 (P1814R0(英語)) | - | - | - | - | - | - |
未知の境界の配列への変換を許可する (P0388R4(英語)) | - | - | - | - | - | - |
| + | clangd | clangd | 混合 | 内蔵エンジン | - |
擬似デストラクタがオブジェクトのライフタイムを終了 P0593R6(英語) (DR(英語)) | + (Clang 11) | - | - | - | - | - |
より暗黙的な動き P1825R0(英語) (DR(英語)) | + | clangd | clangd | 混合、Clangd に依存 | - | - |
C++17
言語機能 | エラーのハイライトとクイックフィックス | 補完 | ナビゲーション | リファクタリング |
|---|---|---|---|---|
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
clangd | clangd | 混合、Clangd に依存 | - | |
ネストされた名前空間の定義 | clangd | Clangd のみ、両方、組み込みのみ * | 混合 ** | 組み込みエンジン |
clangd | Clangd のみ、両方、組み込みのみ * | 混合 ** | - | |
clangd | Clangd のみ、両方、組み込みのみ * | 混合 ** | - | |
clangd | clangd | - | - |
* - Clangd 設定で選択したとおり。
** - 両方のエンジンが使用されます。 Clangd はキャレットでの参照のハイライト、 Go to declaration、 Go to definition、 クイックドキュメント、 クイック定義、 使用箇所の検索をサポートします。
C++ コードインスペクション
CLion は、 で構成可能なインスペクションのセットを使用して、C/C++ コードの静的分析を実行します。 一部の C/C++ インスペクションは Clangd によって提供されますが、その他は組み込みエンジンの一部として機能します。
以下の表は、特定のインスペクションまたはインスペクションセットに使用されるエンジンを示しています。
インスペクション | 提供 |
|---|---|
clangd | |
組み込みエンジン | |
一般: 引数選択の欠陥 | clangd |
一般: Clang-tidy | Clangd または組み込み、 選択済み |
一般: 制約のない変数型 | 内蔵エンジン (Clangd に基づく) |
一般: 空の宣言またはステートメント | clangd |
一般: フォーマット指定子 | C/C++ の場合、このチェックは Clang の -Wformat(英語) 診断によってカバーされます。 |
一般: 条件式の | C/C++ の場合、このチェックは Clang の -Wparentheses(英語) 診断によってカバーされます。 |
一般: 一貫性のないネーミング | 内蔵エンジン |
一般: 欠落した switch case | C/C++ の場合、このチェックは Clang の -Wswitch(英語) 診断によってカバーされます。 |
一般: 簡略化可能なステートメント | clangd |
一般: コンストラクターまたはデストラクターからの仮想呼び出し | clangd |