C++ 支持
CLion 集成了 两种语言引擎 ,内置引擎和基于 Clangd 的引擎,两者并行工作。
基于 Clangd 的引擎检测编辑器中显示的警告和错误,并提供快速修复,执行某些导航操作、高亮和代码补全,而 CLion 自身的引擎用于其他代码洞察功能,例如重构。 您可以在 Clangd 设置 中调整 Clangd 功能的作用域。
下表显示了两个引擎 默认 处理 CLion 功能的方式:
* - 在 Clangd 设置 中选择。
** - 两个引擎均被使用。 Clangd 可帮助您高亮光标处的引用, 转到声明、 转到定义、 快速文档、 快速定义、 查找用法。
语言标准兼容性
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
语言特性 | 错误高亮和快速修复 | 代码补全 | 导航 | 解析 | 重构 | |
|---|---|---|---|---|---|---|
字面量后缀 | 部分支持 | - | - | - | - | - |
在所有情况下使 lambdas 中的 | 部分支持 | - | - | - | - | - |
更简单的隐式移动(P2266R1) | 部分支持 | - | - | - | - | - |
| - | - | - | - | - | - |
允许重复属性(P2556R1) | 部分 | - | - | - | - | - |
缩小到 bool 的上下文转换(P1401R5) | 部分 | - | - | - | - | - |
在行拼接之前修剪空格(P2223R2) | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
强制声明顺序布局(P1874R4) | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
使用 UAX 31 的 C++ 标识符语法(P1949R7) | 部分 | - | - | - | - | - |
混合字符串字面量连接(P2201R1) | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
C++20
语言特性 | 错误高亮和快速修复 | 代码补全 | 导航 | 解析 | 重构 | |
|---|---|---|---|---|---|---|
位域的默认成员初始化器(P0683R1) | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
| + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
允许 lambda 捕获 | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
+ | Clangd | Clangd | 混合,依赖于 Clangd | - | - | |
指定初始化器(P0329R4) | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
泛型 lambda 的模板参数列表(P0428R2) | + | Clangd | Clangd | 混合 | 内置引擎 | - |
+ | Clangd | Clangd | 混合 | 内置引擎 | 内置引擎,仅限 重命名 | |
- | - | - | - | - | - | |
基于作用域的 for 语句带初始化器(P0614R1) | + | Clangd | Clangd | 混合 | 内置引擎 | 内置引擎 |
ADL 和不可见的函数模板(P0846R0) | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
| + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
一致性比较( | + | Clangd | Clangd | 混合 | 内置引擎 | - |
一致性比较( | 部分 | - | - | - | - | - |
一致性比较( | - | - | - | - | - | - |
特化的访问检查(P0692R1) | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
默认可构造和可赋值的无状态 lambda(P0624R2) | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
未求值上下文中的 Lambdas(P0315R4) | 部分支持(未实现 | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
| + | Clangd | Clangd | 混合 | 内置引擎 | - |
| + | 内置引擎 | 内置引擎 | 内置引擎 | 内置引擎 | - |
更多上下文中可选的 typename(P0634R3) | - | - | - | - | - | - |
lambda 初始化捕获中的包扩展(P0780R2) | + | Clangd | Clangd | 混合 | 内置引擎 | - |
部分 | Clangd | Clang | - | - | - | |
销毁操作符 delete(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 | 混合 | 内置引擎 | 内置引擎 |
有符号整数是二进制补码(P1236R1) | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
| + | Clangd | Clangd | 混合 | 内置引擎 | - |
+ | Clangd | Clangd | 混合 | 内置引擎 | - | |
| + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
嵌套内联命名空间(P1094R2) | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
部分支持 | - | - | - | - | - | |
+ | Clangd | Clangd | 混合,依赖于 Clangd | - | - | |
- | - | - | - | - | - | |
+ | Clangd | Clangd | Clangd | Clangd | Clangd | |
部分支持 | - | - | - | - | - | |
- | - | - | - | - | - | |
协程(P0912R5) | 部分支持 | Clangd | Clangd | 混合 | 内置引擎 | - |
弃用 | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
弃用某些问题使用的 | + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
| + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
| + | Clangd | Clangd | 混合,依赖于 Clangd | - | - |
- | - | - | - | - | - | |
别名模板的类模板参数推导(P1814R0) | - | - | - | - | - | - |
允许转换为未知边界的数组(P0388R4) | - | - | - | - | - | - |
| + | Clangd | Clangd | 混合 | 内置引擎 | - |
+(Clang 11) | - | - | - | - | - | |
+ | 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 可帮助您高亮光标处的引用, 转到声明、 转到定义、 快速文档、 快速定义、 查找用法。
C++ 代码检查
CLion 使用一组 检查 对您的 C/C++ 代码执行静态分析,可在 中配置。 部分 C/C++ 检查由 Clangd 提供,而其他检查作为内置引擎的一部分工作。
下表显示了特定检查或一组检查使用的引擎。 请注意,Objective-C 检查未列出,除非与类似的 Clang 诊断相关。
检查 | 提供者 |
|---|---|
Clangd | |
内置引擎 | |
通用 :参数选择缺陷 | Clangd |
通用: Clang-tidy | Clangd 或内置引擎,取决于 选择 |
通用: 无约束变量类型 | 内置引擎(基于 Clangd) |
通用:空声明或语句 | Clangd |
通用:格式说明符 | 对于 C/C++,此检查由 Clang 的 -Wformat 诊断覆盖。 |
通用:条件表达式中的 | 对于 C/C++,此检查由 Clang 的 -Wparentheses 诊断覆盖。 |
通用: 命名不一致 | 内置引擎 |
通用:缺少 switch case | 对于 C/C++,此检查由 Clang 的 -Wswitch 诊断覆盖。 |
通用:可简化语句 | Clangd |
通用:从构造函数或析构函数的虚调用 | Clangd |
内置引擎(基于 Clangd) | |
未使用的代码:未使用的表达式结果 | 对于 C/C++,此检查由 Clangd 的 DFA 覆盖。 |
未使用的代码:未使用的全局声明 | Clangd |
未使用的代码: 未使用的 include 指令 | Clangd |
未使用的代码:未使用的宏 | Clangd |
未使用的代码:未使用的结构体 | Clangd |
未使用的代码:未使用的模板参数 | Clangd |
未使用的代码:未使用的类型别名 | Clangd |