Clion——一个并非轻量化但是好用的 IDE

· · 科技·工程

前言

2025/11/21 更新:修改部分描述。

本人因觉得 Dev-Cpp 过于古老,小熊猫因为是 Dev 套皮也经常出一些奇奇怪怪的问题,VSCode 固然好用但是配置又要花时间,所以决定换一个 IDE,然后我就把目光瞄准了 JetBrains 推出的 IDE——Clion。

简介

Clion 是 JetBrains 公司推出的一款用于 C/C++ 代码编写的新一代跨平台 IDE,同时也支持对 Python,Objective-C,Javascript,HTML,CSS,XML 的编写。主要面向进行 C/C++ 工程编写的人群。

那有人就要问了。主播主播,我们是 OIer,不会编写工程怎么办?Clion 其实也支持单文件运行,所以这个不必担心。实在不会的,你还可以去终端里面编译运行。

下面我将以我自己的使用体验详细介绍一下 Clion。

如何配置(Windows)

我用的 Windows 系统,所以这里主要讲 Windows 的配置方法,其他系统可供参考。

安装

第一步,安装它,这个不用我多说了。提一嘴的是 Clion 的磁盘占用空间较大,你需要留出至少 8 GB 空间。另外你可以选择将 Clion 的 bin 文件夹添加到 path。

Clion 支持的系统不少,只要是正常人类使用的系统它应该都是正常的。如果你担心你的系统不支持 Clion,可以参考下面这个表格:

:::info[系统支持列表]

人话:

  1. Windows10 x64。
  2. MacOS。
  3. Ubuntu LTS 或 Fedora Linux 发行版。

:::

安装完以后打开 Clion,你首先会进入一个选择语言和地区的界面,语言选择你看得懂的语言,地区最好选未指定,不然可能会出现意料之外的麻烦。

创建第一个文件并配置运行它

随后你就会进入一个欢迎页面:

旁边的几个选项,在我们只会用到“项目”这一项,随后看向左边的主页面,左下角是 Clion 的入门教程,这个小狮子还挺可爱,不过我们用不着。

我们直接点击一个新建项目。它会让你选择位置,语言标准和是否添加入门提示。按你自己的喜好来就行。

进入你刚刚新建的项目,它会让你先配置一个工具链,Clion 自己是捆绑安装了工具链的,所以大部分情况下你只需要点一下确定就可以了,如果你把 bin 文件夹添加到了 path,你可以在 cmd 里面输入 g++ -v 来查看编译器版本。

进入主界面:

它会默认打开 main.cpp 和 CMakeList.txt,其中 CMakeList.txt 是工程项目在构建时会用到的东西。你可以选择把每一道题都当成工程来编写,但是难免会有些麻烦,所以我选择单文件编译。

点击右上角的运行配置:

选择编辑配置后,会出现以下窗口:

选择“C/C++文件”,按以下方式填写,文件路径最好是英文的,可以是相对或绝对

点击“确定”以后,你就可以单文件一键编译运行啦。默认快捷键是 Shift+F10。旁边的目录条目下也会出现对应的 exe 文件。

当然,也有一个懒人方法:在旁边的目录中右键单击你想要单文件运行的 cpp 文件,点“运行 xxx.cpp”它就会自动给你配置出来一个运行配置,不需要上面说的那么麻烦,随后去右上角加编译命令即可。

当然,你也可以按 Alt+F12 打开终端,接下来的操作不用我多说了,需要注意的是 Clion 默认打开的是 PS,而不是 cmd。终端窗口上面那一行最右边有一个向下的三角,点击它就可以切换到 cmd。

至此,恭喜你,你已经配置好了 Clion!

那有人又要问了:主播主播,我的缺省源这一块谁来给我补?缺省源功能仅针对项目内部文件编写,且你切换项目的时候又要重新配缺省源,实在是麻烦,你可以建一个 cpp 专门放你的缺省源。

创建更多的文件

在项目管理目录上面有一个加号,点击之后会出来很多选项,选择“C/C++ 源文件”即可,取消勾选“添加到目标”这一项,不然你就变成多文件工程了。随后按照上述所说的方法给它搞一个运行配置即可。

需要注意的是,你切换当前所编辑的文件时,对应的运行配置不会切换。比如说你刚刚配置好 2 号文件的运行配置,现在你又切到 1 号文件去编写代码,写完以后想编译运行,一定要在右上角切换运行配置,不然按快捷键以后你只会编译运行 2 号文件。

至此,Clion 在 OI 方面的基本配置和操作已经介绍完了。

功能详解

但是我们还想要了解更多!

代码补全

初步写一些代码,你就可以体验到 Clion 的补全功能,包括自动补全和智能补全。自动补全不用我多说了,智能补全是个啥呢?

如果你是 VSCode 用户,你应该知道有一个插件叫做 Github Copilot,它有一个功能就是根据代码上下文以及你自己的代码风格来自动帮你补全代码。Clion 内部就自带这个功能,而且没有额度次数限制。且完全不需要联网,Clion 直接将 JetBrains 已经训练好的深度学习模型放到了本地来运行,对编写速度有着较大的提升。比如说,在你定义完主函数后,它可能会自动补全出 ios:: 的内容。在你打出 for 以后,它可能会自动补全出循环条件甚至循环内容。

静态分析与 Clang-tidy

Clion 自带了 Clang-tidy,是静态差错的好伙伴!

如果你不知道什么是 Clang-tidy。你可以简单地理解为,它可以实时分析你目前写出的代码,并提供参考修改意见。

比如说我们有以下代码:

#include<bits/stdc++.h>
using namespace std;
long long a;
int b;
int main() {
    cin>>a;
    b=a;
    cout<<b;
    return 0;
}

Clion 会在右上角和代码本身提醒你:“你把一个 long long 赋值给了 int!!!”效果如图。

按快捷键 Alt+6 可以调出查看当前你的代码有多少地方比较危险。比如说刚刚的警告信息就是:Clang-Tidy: Narrowing conversion from 'long long' to signed type 'int' is implementation-defined。翻译过来是将 long long 转成 int 的行为是由编译器来定义的,C++ 标准不对此做定义。

其实只要能跑,警告什么的都可以不管

同时,Clion 还提供了快速修复功能,我们来看以下代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[15][15];
int main() {
    cin>>n>>m;
    for (int i=1;i<=n;i++) {
        for (int i=1;i<=m;i++) {
            //do someting...
        }
    }
    //do someting...
    return 0;
}

很明显变量名字重复了,这个时候 Clion 会报出警告,我们把鼠标移到内层的 int i 上面。

旁边有一个黄色小灯泡,点击以后就会启用快速修复功能,它会帮你选中内层循环中所有的 i,你只需要在键盘上输入新变量名就能全部修改。同时旁边的小蓝圈也在提醒你这里出现了局部变量重名问题。同样的,还有下面这个代码:

#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int> v;
int main() {
    cin>>n>>m;
    for (int i=1;i<=n;i++) {
        int x;
        cin>>x;
        v.push_back(x);
    }
    for (int i=0;i<v.size();i++) {
        cout<<v[i]<<" ";
    }
    return 0;
}

他会提醒你 Use range-based for loop instead。同时旁边也会出现一个小灯泡,点一下就可以变成:

#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int> v;
int main() {
    cin>>n>>m;
    for (int i=1;i<=n;i++) {
        int x;
        cin>>x;
        v.push_back(x);
    }
    for (int i : v) {
        cout<<i<<" ";
    }
    return 0;
}

更多分析功能等待着你在写出石山过后去探索!

代码格式化

Clion 使用了自带的格式化引擎和 ClangFormat,以快速格式化代码。你可以按快捷键 Ctrl+Alt+L 来格式化代码,下面是格式化后的【模板】线段树 1,各位可以看看它自己的码风。

#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;

inline ll read() {
    ll x = 0, w = 1;
    char ch = 0;
    while (ch < '0' || ch > '9') {
        if (ch == '-')w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 3) + (x << 1) + (ch ^ 48);
        ch = getchar();
    }
    return x * w;
}

void write(ll x) {
    if (x < 0) {
        putchar('-');
        x = -x;
    }
    static int sta[35];
    int top = 0;
    do {
        sta[top++] = x % 10, x /= 10;
    } while (x);
    while (top)putchar(sta[--top] + '0');
}

const int N = 1e5 + 5;
int n, m, a[N];

struct segmentTree {
    ll sum[N << 2], tag[N << 2];

    void pushup(const int &u) {
        const int ls = u << 1, rs = u << 1 | 1;
        sum[u] = sum[ls] + sum[rs];
    }

    void pushdown(const int &u, const int &l, const int &r) {
        const int ls = u << 1, rs = u << 1 | 1;
        int mid = (l + r) / 2;
        if (tag[u]) {
            tag[ls] += tag[u];
            tag[rs] += tag[u];
            sum[ls] += tag[u] * (mid - l + 1);
            sum[rs] += tag[u] * (r - mid);
            tag[u] = 0;
        }
    }

    void build(const int &l = 1, const int &r = n, const int &u = 1) {
        if (l == r) {
            sum[u] = a[l];
            return;
        }
        int mid = (l + r) / 2;
        const int ls = u << 1, rs = u << 1 | 1;
        build(l, mid, ls);
        build(mid + 1, r, rs);
        pushup(u);
    }

    void add(const int &l, const int &r, const ll &k, const int &L = 1, const int &R = n, const int &u = 1) {
        if (l <= L && R <= r) {
            sum[u] += k * (R - L + 1);
            tag[u] += k;
            return;
        }
        int mid = (L + R) / 2;
        pushdown(u, L, R);
        const int ls = u << 1, rs = u << 1 | 1;
        if (l <= mid)add(l, r, k, L, mid, ls);
        if (r > mid)add(l, r, k, mid + 1, R, rs);
        pushup(u);
    }

    ll Q(const int &l, const int &r, const int &L = 1, const int &R = n, const int &u = 1) {
        if (l <= L && R <= r) return sum[u];
        int mid = (L + R) / 2;
        const int ls = u << 1, rs = u << 1 | 1;
        pushdown(u, L, R);
        ll ret = 0;
        if (l <= mid)ret += Q(l, r, L, mid, ls);
        if (r > mid)ret += Q(l, r, mid + 1, R, rs);
        return ret;
    }
} T;

signed main() {
    n = read();
    m = read();
    for (int i = 1; i <= n; i++) {
        a[i] = read();
    }
    T.build();
    while (m--) {
        int op = read();
        int l = read(), r = read();
        if (op == 1) {
            int k = read();
            T.add(l, r, k);
        } else {
            write(T.Q(l, r));
            puts("");
        }
    }
    return 0;
}

语法检查

同其他有着语法检查的编辑器或者 IDE,Clion 也自带该功能。这里的语法检查不仅仅限于编程语言,还有自然语言。

Clion 金牌英文早教班这一块。

#include<bits/stdc++.h>
using namespace std;
int main() {
    return 0;
}
/*
Yestreday
I will went to the park tomorrow.
I can gone to the park.
*/

它会提醒你 Yesterday 拼错了,并在旁边亮出一个小灯泡,点击即可快速修复。同时它还会提醒你 will 后面不能接过去式,一样的,点小灯泡即可修复。而第三句,他甚至还会问你 Did you mean go or be gone?

Clion 检查英语语法的规则包括:关于如何正确使用冠词、逗号和过去时形式的规则,常见的拼写错误和常被混淆的单词,正确的搭配等诸多方面的规则。

插件功能

同 VSCode,Clion 也支持很多插件,可以自行慢慢探索。

这里要提一嘴 JetBrains AI Assistant,是一个功能很强大,类似于 Github Copilot 的 AI 插件。不过其在国内访问会“因某些原因不可用”,还是很可惜的。不过 Github Copilot 也在 Clion 的插件列表之中,你可以接着用它。

自定义外观

你可以进设置去调整外观,比如说更改背景图像,更改字体和大小,更改主题等等。有趣的事情是,VSCode 里面有一个主题插件叫做“Clion Theme”,而 Clion 里面恰好有一个主题插件叫做“VSCode Theme”。字体方面我觉得默认的字体就很棒了,你也可以改成自己喜欢的字体。

背景图像的效果如下:

添加其他语言的支持

JetBrains 对几乎所有常用语言都推出了一款 IDE,在理想情况下,不同的语言用不同的 IDE 是最好的,但是总有一些时候你希望在一个 IDE 里面搞定所有。Clion 就对其他部分语言添加了支持。

以 Python 为例。

在设置——构建、执行、部署中,你可以找到添加 Python 解释器的位置,选择好解释器以后,你就可以在 Clion 中愉快地使用 Python 啦!

新建一个 Python 文件的方法和新建一个 C++ 文件的方法是一样的,还是在目录管理上面点加号。想要允许一个 Python 文件,你需要先配置运行配置,可以用我说的懒人方法,对着文件点右键然后直接运行,它就会自动配置了。

需要注意的是 Clion 自带的智能补全功能只针对 C/C++,如果你想在 Python 里面接着用智能补全,跟随它的提示下载 Python 的补全模型即可。

缺点

说了这么多,Clion 为什么并不是大多数人的选择呢?

  1. 内存占用高。不轻量化。

    无论是磁盘内存还是运行内存,Clion 都高到离谱,运行内存至少占用 3 GB,在后台运行的时候也能有 1 GB 左右。不适合一般学校机房使用。对于高性能电脑体验会更加好。为什么运行内存占用会这么高?我推测是在本地持续跑 LLM 以及静态代码分析导致的。说白了,对 OI 来讲 Clion 可能会显得有点臃肿

  2. 对商业用途不是免费的,对非商业用途免费

    在使用 Clion 之初,你应该就会发现右下角标了一个【试用】。没错,Clion 是付费软件,你第一次下载以后 JetBrains 会给你发一个 30 天的试用许可证。30 天试用结束以后,就会要求你激活自己的许可证,不然就不让你用了。Clion 本身提供非商业开发许可证,这个是免费的,你只需要注册一个 JetBrains 账号,并点一点就能获得一年的非商业许可证。如果你想白嫖付费许可证的话请自己解决。这条对 OIer 来讲并不是一个很大的限制。

  3. 插件没有 VSCode 丰富。

    这个其实不是主要问题,VSCode 的功能强大的主要原因就是因为庞大的插件社区,其本身就不属于 IDE 这一类别。自然可拓展性就要比 Clion 好得多。Clion 作为一个 IDE,它能做的就是把 C/C++ 的编写体验做好做扎实。