毫无编程基础的小白准备学习C语言,用VC6还是VS2015?
欢迎访问博客: 为什么 C/C++ 初学者应该使用 CLion 而不是 Visual Studio?
================
初学者用 CLion 吧,折腾啥 VS 呢?
(此文略复杂, 所以——
真×小白只用看加下划线的部分即可 ,
真×小白只用看加下划线的部分即可 ,
真×小白只用看加下划线的部分即可 , 加粗而没下划线 的不太重要)
================
=====吐槽的分割线=====
================
- 无论是 VC 6(其实 VC 6 还是挺萌的,毕竟还能装 VAX,体验不输没装 ReSharper 的现代版本 VS)还是 VS 2015,都不真正支持 C。
- VS 巨大,安装包大达数 G,带上 update 更大,而 CLion 安装文件只有 200 多 MB。
- VS 的配置复杂难懂,受制于遗留太多,比如配色界面选项巨多,很多东西不知所云,而且没有预览。
- CLion 能给出更多的分析/提示(比如 unsed variable, unreachable code, missing break 等等),对新手更有用(对人类都很有用)。
- CLion 有更良好的开发体验(VS 的快捷键很多都是连招才能发的,比如注释、格式化)。
- CLion 是完全跨平台的,它的 IDE 本身全平台都有版本,项目文件/构建工具(即 CMake)也是跨平台的。CMake 是微软钦定的跨平台构建工具,CoreCLR、ChakraCore 等项目都是用 CMake 构建的。
- VS 写模板的时候 IDE 功能基本失效。参考 Visual Studio not giving me errors because of template before each function. C++
当然,空口无凭。在 tutorial 的后面我会做一个类似基准测试的东西,比较一下 CLion 和 VS 的体验,和对初学者的帮助。(非小白可以略过 tutorial)
================
=====教程的分割线=====
================
那么说了这么多,该怎么用 CLion 呢?
===========题外话===========
如果你已经装了 VS,又想享受以上好处,那就装 ReSharper C++ 吧。详情可以参考 如何摆脱对Visual Studio的依赖? - Colliot 的回答 。
==========进入正题==========
我们知道,集成开发环境(IDE)和编译工具链(toolchain)是不必然绑定的。所以接下来我们分两步,第一步搞定 IDE,第二步搞定工具。下面开始第一步。
----------------
---第一步--安装环境----
----------------
安装 CLion 很简单,就是一个 .exe 的安装包( https://www. jetbrains.com/clion/dow nload/ ),两百兆,安装好了可能一个G,安装速度也不会比一般的软件更慢 (参考 VS 的 11G 起,虽然 VS 15 改进了,可是我这里网慢装不上,类似地,装 Bash for Windows 也很慢,还看运气)
---------------- --第二步--安装工具链---- ----------------
工具链方面,推荐使用 msys2 (遵照这个回答安装 tdm-gcc, 毫无编程基础的小白准备学习C语言,用VC6还是VS2015? - Belleve 的回答 ,然后使用 CLion 自带的 CMake,应该也是可行的)。msys2 是一个 cygwin 的 fork,加上了用 pacman 支持的包管理系统(不用什么 cyg-apt, apt-cyg 了),同时支持 MinGW 的编译工具链。源里一般有三份 binary(mingw 32位/64位,msys2)。
安装的话,只要在它的主页下载安装包就好了(MSYS2 installer),推荐 64 位(x86_64 ,不是i686,以下步骤可能与此相关。32位也是可以的,但是部分文字可能有所区别)的。这很小,因为只有最基本的 shell,没有预装工具链。 安装之后,可以在开始菜单找到它:
三个入口,做了一些环境的设置,win32的进去,默认的工具链都会是 32 位 mingw 的版本(mingw_w64_i686),win64的进去就是64位的(mingw_w64_x86_64),msys2 进去就是 msys2 的(类似 cygwin,编译出来需要一个 dll 才能运行)。随便哪个打开都可以。
现在 msys2 里啥都没有,只是一个空壳,我们需要装相应的工具链。 根据makefile - CMAKE_MAKE_PROGRAM not found, 我们需要装的东西如下:
pacman -S mingw-w64-x86_64-cmake mingw-w64-x86_64-extra-cmake-modules
pacman -S mingw-w64-x86_64-make
pacman -S mingw-w64-x86_64-gdb
pacman -S mingw-w64-x86_64-toolchain
只要原样输入这四条,每次回车,并根据提示一路回车就可以了 (里面似乎有重复的,实际上应该只要第一行和最后一行即可),32 位的可能需要将 w64_x86_64 改为 w32_i686。
现在我们有了完整的工具链,包括 gcc, make 和 cmake。这样,CLion 就能运作了。
初次打开 CLion,它可能会让你选择工具链,或者,以后可以在 File -> Settings (Ctrl+Alt+S)里更改:
如果是 32 位的,就应该在 msys2 安装目录下的 mingw32 文件夹下的相应位置,而不是 mingw64。一个能正常运行的配置应当如上图所示。
这样我们就完成了整个环境的配置,可以开始写了。
================
=====开始用的分割线====
================
打开 CLion,新建一个项目(project),你会看到两个文件,一个是你期待的 main.cpp,另一个是 CMakeLists.txt,这是 CMake 的构建清单,相当于项目文件。如果你只是要单纯地写 C++ 一个小程序,直接在 main.cpp 里写就可以了,无须做任何设置。 如果你需要写 C 语言,直接写也可以,但是最好将后缀名改为 .c——方法是右键 main.cpp,选择 Refactor->Rename,或者在文件列表中选中 main.cpp,然后按 Shift+F6。
项目和构建系统方面,Clion 采用的是(两者都基于)跨平台的 CMake 元构建系统,不像VS使用的是私有项目系统和 MSBuild(?)。 CMake 可以轻松支持多个目标(可执行文件、库)的构建 (当然 VS 也可以,你只要添加“项目”,而不是新建“项目”或者添加”文件“。微软也支持 CMake,它开源的 .NET Core, CharkraCore 等项目都使用 CMake。
CMake 和 CLion 基于 CMake 的项目分析都能正确区分 C 和 C++ 的扩展名,给予正确的编译、构建和分析。因此,只要自己注意扩展名是 .c 还是 .cpp/.cc/.C 等即可。
实际上,构建多个目标,是小白很常见的一种需求。比方说如果在做题,总不可能为每个题目都新建一个项目吧。这时候我们就需要改动项目了。和 VS 的图形设置不同,CLion 的项目基于文本,也就是 CMakeLists.txt。
如果你要添加一个可执行文件(比方说,就是开始写另一道题目),最简单的命令就是
add_executable(可执行文件名 源码1 源码2 源码3 …),只要会这一条,应该就可以解决所有小白时代的需求了。 比如 add_executable(another_solution solution2.c) 就声明了一个名为 another_solution 的可执行文件(扩展名会自动根据平台添加,比如 Linux 就没有,Windows 下就是 .exe),它是从 solution2.c 编译过来的。
CLion最新的项目模板中,CMakeLists.txt的样子应该是这样的(也就是你看见的模样):
#cmake_minimum_required(VERSION <specify CMake version here>)
project(testflight)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_executable(testflight ${SOURCE_FILES})
如果,你要像上面一样添加了名为 another_solution 的目标的话,新的 CMakeLists.txt 就应该是这样的:
#cmake_minimum_required(VERSION <specify CMake version here>)
project(testflight_curses)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_executable(testflight ${SOURCE_FILES})
add_executable(another_solution solution2.c)
当然,记得新建 solution2.c 这个文件,你可以通过右键任意文件->New->C++ Source File的图形界面来新建,也可以直接New->File,然后输入 solution2.c ,后者相比前者,不会有模板内容,是个空文件。不过对于源文件(相比于头文件),这并没有任何影响。
我想,小白看到这里,大概就已经完全能满足需求了。剩下的,只要多留意 CLion 给你的提示即可。
(以下对小白不重要) 第一行被注释了(也许没有),本来是一个 限定最低 CMake 版本的指令 。底下是 声明项目名称 。set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 是 更改编译器标识 ,比如默认是附加了按照C++11标准编译的标识,你可以安全地改成c++14,或者想复古,改成c++98等。注意到这是C++编译器的标识。如果是纯C,也可以指定C_FLAGS
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")等等。理论上所有flags都可以在这里指定,但是某些有更优雅的方法。一个例子是这个回答 CLion 链接库?如 lpthread 怎么设置? - 软件开发 。
它没有直接add_executable,而是定义了一个变量SOURCE_FILES,然后用这个变量去add_executable。所有存在的 CMake 变量可以在 CMake 工具窗口的 Cache 一栏查看:
当你新建一项(类/源文件/头文件)的时候,它会提示你是否要添加到某个target中。当然你也可以
不选,然后手动添加,如果你会初级的CMake(并不难)。
对于新建的头文件,它会自动给你建好 guard,具体内容也可以在设置里改。
调试什么的,就是给gdb做了个前端,中规中矩。然后在代码旁边打出当前变量的值,这也是JetBrains系统的标配。
整个体验就是JetBrains那一套很友好的东西, 比如所有 action/setting 都是可搜索的,随时快捷键查找文件、符号等。特别是双击 Shift,什么都能找
唯一的问题就是你需要一些性能。可能是因为做了复杂的分析,CLion(相比 IntelliJ IDEA 等)更加吃内存和 CPU,默认的 JVM 堆大小是 2G,而索引的时候常常会吃满 CPU(见下图):
================
====测评的分割线======
================
好,说好的测评时间。开篇的对比,为了避免空口无凭,我们做一些具体项的测试:
因为这边网不好,VS 15 Preview 3 以后的在线安装包安装不了,VS 这边就选用有离线安装包的 VS 15 Preview 2(是 VS 15,不是 VS 2015 = VS 14,以下请注意区分 )。CLion 版本是 2016.2。都是全新安装。
为了观感统一,我把两者的配色都调成尽可能一样的了。(我喜欢给每一类 token 一种色系,比如关键字红色,函数绿色系,变量黄色系,类型蓝色系,实际上是基于 Monokai 细化的,这样一看就知道代码的结构了。)
CLion 的配色界面:
VS 的配色界面:
注意 VS 无法设置斜体,也没有修饰效果(比如下划线,删除线等)。VS 的配色界面是没有整体预览的。
下面进行解析力测试(以下皆左 CLion,右 VS):
整体看起来差不多,也说明了 VS 15 还是比较现代的。细节处的不同隐喻了 VS 的一些坑,后面再细说。总而言之,两者的高亮区分主要有这些不一样的地方:
- CLion 区分了 Typedef , Enum 和 Class ,而VS没有
- VS 区分了 模板类 和 普通类 ,CLion 没有
- VS 区分了 成员函数 、 静态成员函数 和 全局函数 ,CLion 没有
- VS 区分了 字段 和 静态字段 ,CLion 没有
- CLion 区分了重载运算符,VS 没有(也许有)
格式化方面,其实 VS 没什么问题了现在。我记得当年 VS 2013 的体验是很差的,但是 VS 15 足够称得上现代了(VS 2015 不知道,装着 ReSharper C++,不想测)。
两者都能正确格式化,在输入代码的时候也会正确自动格式化(VC 6 就会有蜜汁缩进)。
其实 VS 15 还是比较标准的。这应该是微软转型的一步棋,一如用友好的方式开源 .NET Core。(虽然 Preview 2 版本还是默认预编译头)。VS 15 默认模板是 main ,而不是 _tmain,看起来也不强制你使用 scanf_s。这个似乎应该归功于 CRT 的进一步标准化?我记得 VS 2015 还需要 #define _CRT_SECURE_NO_WARNINGS 来着,VS 15 已经不需要了 。
我们注意到以上两图中,CLion 的那边经常会出现一些标为灰色的、或者带有波浪下划线的内容,而 VS 却没有任何提示。这是 CLion 多给的提示。具体而言,CLion 会提示
- 未使用的变量、函数
- 可能未初始化的局部变量
- 循环中未更新循环条件
- 不可达代码