CLion 2025.2 Help

C++ 支持

CLion 集成了 两种语言引擎 ,内置引擎和基于 Clangd 的引擎,两者并行工作。

基于 Clangd 的引擎检测编辑器中显示的警告和错误,并提供快速修复,执行某些导航操作、高亮和代码补全,而 CLion 自身的引擎用于其他代码洞察功能,例如重构。 您可以在 Clangd 设置 中调整 Clangd 功能的作用域。

下表显示了两个引擎 默认 处理 CLion 功能的方式:

IDE 功能

语言引擎

语法高亮

Clangd

错误/警告和快速修复

Clangd

代码补全

仅 Clangd、两者或仅内置引擎 *

格式化:ClangFormat

Clangd

格式化:代码风格设置

内置引擎

导航

两者 **

参数提示

Clangd

重构

内置引擎

* - 在 Clangd 设置 中选择。

** - 两个引擎均被使用。 Clangd 可帮助您高亮光标处的引用, 转到声明转到定义快速文档快速定义查找用法

语言标准兼容性

CLion 完全支持 C++11C++14C++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

部分支持

  • Clangd 支持的功能的解析和重构

  • 扩展的 概念支持 (基于 Clangd):自定义高亮、代码补全、专用检查、重命名重构、导航操作(如转到定义和查找用法)。

  • 模块的初步支持 (基于 Clangd):关键字高亮、代码补全、在声明和定义之间导航、查找用法和模块内的重构,以及一些跨模块的重构。

C++17

从 Clang 5 开始全面支持

部分支持

C++14

全面支持

全面支持

C++11

全面支持

全面支持

C++2b

语言特性

Clang 支持状态

错误高亮和快速修复

代码补全

导航

解析

重构

字面量后缀 uzz 用于 size_tssize_tP0330R8

部分支持

-

-

-

-

-

在所有情况下使 lambdas 中的 () 可选(P1102R2

部分支持

-

-

-

-

-

更简单的隐式移动(P2266R1

部分支持

-

-

-

-

-

if constevalP1938R3

-

-

-

-

-

-

允许重复属性(P2556R1

部分

-

-

-

-

-

缩小到 bool 的上下文转换(P1401R5

部分

-

-

-

-

-

在行拼接之前修剪空格(P2223R2

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

强制声明顺序布局(P1874R4

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

使用 UAX 31 的 C++ 标识符语法(P1949R7

部分

-

-

-

-

-

混合字符串字面量连接(P2201R1

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

C++20

语言特性

Clang 支持状态

错误高亮和快速修复

代码补全

导航

解析

重构

位域的默认成员初始化器(P0683R1

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

const& 限定的成员指针(P0704R1

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

允许 lambda 捕获 [=, this]P0409R2

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

__VA_OPT__ 用于预处理器逗号省略(P0306R4P1042R1

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

指定初始化器(P0329R4

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

泛型 lambda 的模板参数列表(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

-

-

const 与默认复制构造函数不匹配(P0641R2

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

一致性比较(operator<=>): P0515R3 P0905R1 P1120R0 P1185R2 P1186R3 P1630R1 P1946R0 P1959R0

+

Clangd

Clangd

混合

内置引擎

-

一致性比较(operator<=>): P2002R1

部分

-

-

-

-

-

一致性比较(operator<=>): P2085R0

-

-

-

-

-

-

特化的访问检查(P0692R1

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

默认可构造和可赋值的无状态 lambda(P0624R2

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

未求值上下文中的 Lambdas(P0315R4

部分支持(未实现 temp.deduct/9

Clangd

Clangd

混合,依赖于 Clangd

-

-

[[no_unique_address]] 属性(P0840R2

+

Clangd

Clangd

混合

内置引擎

-

[[likely]][[unlikely]] 属性(P0479R5

+

内置引擎

内置引擎

内置引擎

内置引擎

-

更多上下文中可选的 typename(P0634R3

-

-

-

-

-

-

lambda 初始化捕获中的包扩展(P0780R2

+

Clangd

Clangd

混合

内置引擎

-

作为非类型模板参数的类类型(P0732R2P1907R1

部分

Clangd

Clang

-

-

-

销毁操作符 delete(P0722R3

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

constexpr 限制的放宽(P1064R0P1002R1P1327R1P1330R0P1331R2P1668R1P0784R7

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

禁止具有用户声明构造函数的聚合类型(P1008R1

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

特性测试宏(P0941R2

Clangd

Clangd

混合,依赖于 Clangd

-

-

explicit(bool)P0892R2

+

Clangd

Clangd

混合

内置引擎

内置引擎

有符号整数是二进制补码(P1236R1

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

char8_tP0482R6

+

Clangd

Clangd

混合

内置引擎

-

即时函数(consteval)(P1073R3P1937R2

+

Clangd

Clangd

混合

内置引擎

-

std::is_constant_evaluatedP0595R2

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

嵌套内联命名空间(P1094R2

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

结构化绑定扩展(P1091R3P1381R1

部分支持

-

-

-

-

-

更强的 Unicode 要求(P1041R4P1139R2

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

带括号的聚合初始化(P0960R3P1975R0

-

-

-

-

-

-

模块: P1766R1DR), P1779R3

+

Clangd

Clangd

Clangd

Clangd

Clangd

模块:(P1874R1), P2115R0P1103R3P1815R2

部分支持

-

-

-

-

-

模块: P1979R0P1857R3P1811R0P1703R1

-

-

-

-

-

-

协程(P0912R5

部分支持

Clangd

Clangd

混合

内置引擎

-

弃用 a[b,c]P1161R3

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

弃用某些问题使用的 volatileP1152R4

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

[[nodiscard("with reason")]]P1301R4

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

using enumP1099R5

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

聚合类型的类模板参数推导(P1816R0P2082R1

-

-

-

-

-

-

别名模板的类模板参数推导(P1814R0

-

-

-

-

-

-

允许转换为未知边界的数组(P0388R4

-

-

-

-

-

-

constinitP1143R2

+

Clangd

Clangd

混合

内置引擎

-

伪析构函数结束对象生命周期 P0593R6DR

+(Clang 11)

-

-

-

-

-

更多隐式移动 P1825R0DR

+

Clangd

Clangd

混合,依赖于 Clangd

-

-

C++17

语言特性

错误高亮和快速修复

代码补全

导航

重构

auto 非类型参数

Clangd

Clangd

混合,依赖于 Clangd

-

UTF-8 字符字面量

Clangd

Clangd

混合,依赖于 Clangd

-

*this 的 lambda 捕获

Clangd

Clangd

混合,依赖于 Clangd

-

[[nodiscard]] 属性

Clangd

Clangd

混合,依赖于 Clangd

-

[[fallthrough]] 属性

Clangd

Clangd

混合,依赖于 Clangd

-

[[maybe_unused]] 属性

Clangd

Clangd

混合,依赖于 Clangd

-

'noexcept' 作为函数类型的一部分

Clangd

Clangd

混合,依赖于 Clangd

-

单参数 static assert

Clangd

Clangd

混合,依赖于 Clangd

-

if constexpr

Clangd

Clangd

混合,依赖于 Clangd

-

内联变量

Clangd

Clangd

混合,依赖于 Clangd

-

大括号初始化列表中 auto 推导的新规则

Clangd

Clangd

混合,依赖于 Clangd

-

constexpr lambdas

Clangd

Clangd

混合,依赖于 Clangd

-

嵌套命名空间定义

Clangd

仅 Clangd、两者,或仅内置引擎 *

混合 **

内置引擎

折叠表达式

Clangd

仅 Clangd、两者或仅内置引擎 *

混合 **

-

类模板参数推导

Clangd

仅 Clangd、两者,或仅内置引擎 *

混合 **

-

__has_include

Clangd

Clangd

-

-

* - 在 Clangd 设置 中选择。

** - 两个引擎都被使用。 Clangd 可帮助您高亮光标处的引用, 转到声明转到定义快速文档快速定义查找用法

C++ 代码检查

CLion 使用一组 检查 对您的 C/C++ 代码执行静态分析,可在 设置 | 编辑器 | 检查 | 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

最后修改日期: 2025年 9月 26日