Linux下C/C++ IDE推荐
如果是windows下,不用考虑了,直接visual studio,免费,功能强大。
linux下有很多ide,但是都不太好用,这里就个人使用,并且针对特定工程做一下介绍。
每种ide,如果用习惯了,肯定都可以胜任工作,这是个人习惯问题,本人就以个人上手以及某几个测试用例来说一下体验。
测试场景就是,常见的公司项目,代码量比较大,头文件引用比较多,各种宏定义和指针。比如有一个结构体,很多源文件都在用,定义在一个公共头文件中,结构体中有指针,还有宏定义的内容,还有根据宏定义来确定是否加载的成员变量。开发过程中,难免会遇到这样的结构体,并且需要跟踪查看其定义,还需要编写的时候智能提示。
测试示例一
可以打开文件夹。因为项目不可能依赖某种ide开发,正常都是配置文件加编译脚本,所以ide必须可以直接导入或者打开对应文件夹,然后阅读代码,进行开发
测试示例二
可以识别任意函数。在当前窗口,有一个列表可以查看所有的函数,并且可以点击定位到函数,即使函数参数中有宏定义的内容,也可以正确识别
测试示例三
可以配置快捷键。有的IDE既不提供自定义快捷键,还把常用的快捷键设定的很复杂,简直反人类。
测试示例四
复杂的嵌套结构,可以准确识别变量类型,并且可以正常跳转到定义位置。
阅读代码的时候需要可以跳到定义内容,悬停可以查看变量类型,编写代码可以直接提示。
union U1
{
#ifdef D5
struct S3 v6;
#endif
int v7;
};
struct S2
{
union U1 v8;
int v6;
};
#define D1 \
int v5; \
struct S2 v4;
#define D3 \
int v3;
struct S1
{
D1
#ifdef D2
D3
#endif
#ifdef D4
int v1;
#endif
int v2;
};
struct S1* test;
对于test变量,可以直接使用.访问到以上的任何变量,不能因为嵌套就无法访问;不能因为宏定义就无法访问,比如v1,不能因为没有定义D4就无法访问;不能因为是宏定义中的内容就无法访问,比如D1中的v5 v4,并且D1中嵌套的v4 v8 v6都可以访问到;不能因为定义了宏中的宏替换的内容而无法访问,比如D3指定的v3。
常见排除的ide
vim emacs sublime text
这些文本编辑器很好用,但并不适合做ide。有些人为了显示自己多牛,张口就来,说vim/emacs配置好多么无敌,或者说某某大神都是这样开发。本人并不认同这样的观点,首先,为什么需要这么复杂的配置一个文本编辑器?其次,配置完也并不好用。
很多大神这样开发有可能是因为大神都是入行早,那时候并没有这些好用的ide,没办法只能强行对当前的工具改造。等后续新的ide出来了,自己也习惯了原来的工具,不想折腾了。
还有有人说在服务器上开发没有图形界面,就个人经验,感觉是非常不负责任。真正项目,没人会在服务器上直接开发,线上服务器肯定不肯能直接开发,本地服务器都是用作编译测试的,这么多人开发项目,都在一个服务器上?版本管理器也不用吗?服务器能受得了?在服务器上开发顶多是临时应急或者排查问题。正常流程都是本地开发,推送到服务器编译测试。在服务器上直接开发,出了问题算谁的?既然本地开发为什么自己找罪受,非要弄一个无图形界面的环境。不是用的东西越古怪就越厉害,不要把精力浪费在无用的事情上面。
eclipse
当时写jsp的时候就不是特别喜欢它,随着现在各种专业的ide越来越便捷智能,eclipse慢慢就被淘汰了。工具庞大,启动缓慢,配置复杂,背靠IBM的eclipse并没有给大家带来惊喜。
Code::Blocks
虽然很多推荐都把这个放在首位,个人感觉就是赶紧放弃。简陋,功能少,不好用
NetBeans CodeLite
这两个也常常出现在推荐上,也赶紧放弃,比Code::Blocks还简陋。CodeLite与文本编辑器差不多。而NetBeans是基于java的,本来就不怎么样,还是用java开发,打开缓慢,占用资源多。
其他
其他的比如KDevelop Geany等就不用看了,要么早就不维护了,要么依赖固定的桌面环境,并且都是功能简陋。
上面的这些ide主要的缺点就是
- 无法正常打开文件夹工程。要么有的根本没有对应的功能,要么就非常复杂,要各种转换。绝大部分都是需要创建一个对应的工程,然后把自己的目录再添加进去,非常麻烦,还不好用
- 测试示例四都无法通过,包括eclipse。这个是所有上面提到的ide都挂掉的一个case,这是绝对不考虑的。作为开发者,大部分时间都在与ide打交道,做开发,结果写代码没有提示,需要各种翻变量名,手写,无法忍受
- 功能简陋。比如代码自动格式化,快捷键编辑,定义跳转,引用查询等都没有
可能有人会说有的ide可以满足需求,是因为不会配置。首先系统上已经安装了gcc clang cmake等工具,正常来说一个专门针对某种语言的ide,如果最基本的配置-必须依赖相关语言的工具,安装后没有默认附带,没有提示安装,同样没识别到系统中已经安装的信息,配置起来还很麻烦,配置完后也不好用,我何必用它呢。
3个选择
CLion
Jetbrains的口碑一直不错,CLion在linux下使用起来体验也可以。唯一缺点是java开发,可能启动慢,占用资源多。但是快捷键可编辑,代码提示优秀,上面的四个测试全部通过。可配置性高,如果入了Jetbrains全家桶,使用习惯统一,非常不错。不过还有一个需要考虑的是,它是付费的。
Visual Studio Code VS Code
vs code社区比较活跃,对应的各种插件都齐全,并且支持不需要保存文件修改而直接退出,下次打开会直接定位到上次开发的位置。使用中遇到的问题就是有时候代码解析有问题,跳转不了,重启可以解决。还有就是不能多种语言编码格式混合使用,有时候会覆盖冲突。可能有人介意其底层是js实现的,属于一个前端的工具。不过也正式由于这个原因,自定义内容非常丰富,与Jetbrains系列一样的可以自动识别文件语言,提示加载对应的插件。
Qt Creator
虽然这个是针对于qt而开发的ide,但是也适合作为c/c++的ide。不过其打开文件夹必须要创建一个其对应的工程,创建的过程比较友好,但是不如上面两个方便。还有一点就是打开的文件不是平铺在上面,而是在一个下拉列表中选,可能用习惯了那种平铺的,有点不适应。qt creator是c++开发的,启动相对快速,占用资源可能少一些。其默认是一个light主题,代码开上去也舒服。不过下载安装很难找到离线安装包,在线安装必须要有qt的账号。其缺点就是插件少,可定制化低。
总结
新增测试一
main.c引用一个头文件a.h,a.h中声明了一个extern int a[10];,a.c中定义了int a[10];,在main.c中使用memset(a, 0, sizeof(a));进行初始化数组,这时在main.c的memset中需要可以定位到a.c中真正定义的地方,也可以定位到a.h中声明的地方。
新增测试二
开发新模块,从另一个现有的模块复制对应的代码,然后修改。修改过程中肯定会有与原来模块相似的变量名,或者临时删除定义,但是代码中还在使用的结构体等。期望能够正常跳转定义,而不会出现无法定位变量位置,或者定位错误的现象。
比如有一个mysql模块,定义了很多mysql相关的结构体:mysql_data。现在要开发一个oracle模块,复制过来,修改为oracle_data,在开发过程中可以正常定位,而不会出现查找oracle_data的定义,结果定位到mysql_data。
新增测试三
代码中常见的一些容易导致错误的写法,是否可以提示。比如在判断语句中使用了复制语句;或者在正常复制时误写成==,判断是否相等。因为这些肯定是有问题的,比如本来想写a=1;
,结果写成了a==1;
,单独写一个判断语句是没有任何意义的,绝大多数情况都是误写,ide应该能提示出来。
CLion | Visual Studio Code | Qt Creator |
---|---|---|
付费 | 免费 | 免费 |
下载方便 | 下载方便 | 下载麻烦,官网没有明显下载Qt Creator的指引,需要在下载Qt比较深的目录再选择Qt Creator |
必须登录账户 | 不必登录账户 | 必须登录账户 |
下载的是官方安装工具,需要再次选择安装 | 直接安装 | 下载的是官方工具,需要再次选择安装 |
可以直接打开目录 | 可以直接打开目录 | 需要创建工程->导入->创建工程名->指定目录 |
可以配置快捷键 | 可以配置快捷键 | 可以配置快捷键 |
可以后退上一个位置 | 可以后退上一个位置 | 可以后退上一个位置 |
支持不同文档Split View | 支持不同文档Split View | 支持不同文档Split View |
支持同一文档Split View | 支持同一文档Split View | 支持同一文档Split View |
测试示例四通过 | 测试示例四通过 | 测试示例四通过 |
默认代码格式化功能丰富 | 默认代码格式化功能正常 | 默认代码格式化简单 |
配置代码格式化简单,提供了选项配置 | 配置代码格式化相对简单,有对应选项配置,也可以自己设置 | 配置代码格式化相对复杂,需要安装插件,然后选择格式化工具,默认功能简单,需要手动配置 |
粘贴代码自动格式化 | 粘贴代码自动格式化 | 粘贴代码不会格式化 |
编写代码自动格式化,包括;}等 | 编写代码自动格式化(;有作用)(}不起作用) | 编写代码不能格式化 |
支持保存格式化 | 支持保存格式化 | 支持保存格式化 |
新增测试一不通过,会定位到memset函数,无法定位到变量真正的位置。但是如果在memset中,在第三个参数,使用sizeof获取设置变量长度,通过这里可以定位到 | 新增测试一通过,因为vs code最终使用gcc或者clang进行解析,目前所有的代码解析基本都依托于gcc/clang,猜测clion是使用gcc/clang后,自己做了一些工作,反而导致代码关联有问题,不如vs code直接使用gcc/clang的效果好 | 未测试 |
新增测试二通过,可以很好的、及时的同步修改的代码索引 | 新增测试二通过,需要配置Code Analysis,如果不能及时自动解析,可以在右下角,找到对应的位置,选择立即运行。解析可以选择是针对当前文件,还是打开的文件,还是所有文件 | 未测试 |
新增测试三通过,jetbrain全家桶的智能提示都非常好用,使用过goland和clion,都可以针对误写的代码作出提示。 | 新增测试三不通过,没有任何提示,警告,报错都没有。 | 未测试 |
从长时间使用下来看,vs code和clion都不错。目前开发查看代码使用vscode,而编译调试使用clion。