在 Windows 下用 GCC 编译器练习 C/C++ 的简单教程

最近有许多师弟师妹们问入门 C 语言和 C++ 的时候练习代码应该装什么软件

根据老师和前辈们的建议以及我这一年的折腾经验,在 Linux 系统下学习 C 语言和 C++ 的话那真是极好的,但是鉴于现实的情况(例如 Linux 系统的命令行操作对于一个暂时对电脑不是非常了解的人来说可能一开始不太好上手),很多东西还是需要在 Windows 下进行。

在 Windows 下编程,大多数人用的是“宇宙最强IDE”—— Visual Studio (ps: IDE 是集成开发环境的简称),VS 的确好用,基本把你需要的东西都准备好了,然而装过的人都知道,装这东西有时候可以折腾你一下午,没设置好的话可能一下子装了几 GB 现在的我们还不知道是拿来干什么的东西。

师兄推荐了 Code::Blocks 这个相比 VS 更纯粹的IDE,但我觉得可以更简单。

所以我推荐 文本编辑器 + GCC 编译器 这个无敌组合,用来入门已经足够了。以后我们写相对复杂的项目的时候,再用 IDE 来帮助我们更好地组织我们的代码,我想这样会更好。

为什么用这个组合

首先我们应该要对 C 语言/ C++ 程序的运行流程有一个基本的认识,从 Think-C 的1.1节我们可以知道。C/C++的源代码 (source code) 需要经过编译 (compiling) 这个过程转换为机器码才能运行。

snipaste_20170812_212454.png

本质上来说,其实所有的 C、C++、Java、Python 等语言的源代码(对应的源文件后缀分别为.c .cpp .java .py等)都属于文本文件,仅仅是文件名后缀的差别而已,所以它们都可以通过文本编辑器编辑。类似 Visual Studio,Code::Blocks 这样的 IDE ,它也可以说是文本编辑器以及编译器和调试器等等工具的结合体,通过IDE入门编程,点击编译按钮的背后,IDE为我们做了什么事情,我们很难注意到。我们写代码总不可能依赖于某个编程工具,所以趁现在写的东西还不复杂的时候,多多了解、亲身体验一下那些相对更底层的东西,对我们的发展是很有帮助的。

入门阶段的我们写的程序基本是在命令行(又叫终端)下运行的,即使你直接在Windows的图形界面下运行这些程序,系统还是要弹出一个命令行窗口为它提供一个运行的环境,熟悉命令行的重要性不言而喻。GCC全套工具都是在命令行下使用的,还有许多优秀的工具和程序,例如 Python 解释器、Node.js 以及依赖 Node.js 的一系列网页前端开发的工作流、以后工作或参与开源项目时肯定会用到的 Git,SVN 等版本控制工具等等,也是在命令行下运行的。在使用GCC的过程我们可以收获很多关于命令行的概念和使用技巧,对命令行形成一个初步的印象。

学习计算机,我们无可避免的要接触到 Linux 操作系统。通过 GCC 编译器的使用我们也可以为熟悉 Linux 打下基础,Linux 命令行方面的功能是非常强大的,它包含了许许多多优秀的工具,GCC 只是它其中的冰山一角。工具繁多,一开始总会让人感到眼花缭乱,学习曲线也相对陡峭。平时我们可能熟悉 Windows 多一些,Windows 的命令行与 Linux 也有许多相似之处,可以作为一个过渡的方式。

最关键的是,相比 VS 动辄上 GB 的空间占用,这个装完最多也就占用几百M硬盘空间,岂不是美滋滋?

关于 GCC 的介绍

引用一段来自维基百科的解释:

GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),一套编程语言编译器,以GPLLGPL许可证所发行的自由软件,也是GNU项目的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。1985年由理查德·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。

原名为GNU C语言编译器GNU C Compiler),因为它原本只能处理C语言。GCC很快地扩展,变得可处理C++。之后也变得可处理FortranPascalObjective-CJavaAda,以及Go与其他语言。

许多操作系统,包括许多类Unix系统,如Linux及BSD家族都采用GCC作为标准编译器。苹果电脑Mac OS X操作系统也采用这个编译器。

文本编辑器的选择与安装

说到文本编辑器,我们第一时间想到的应该就是记事本了,但是有一点大家要切记,除非极端情况,千万不要用 Windows 自带的记事本写代码,否则可能会有许多玄学问题出现,参考知乎上的这个回答

适合写代码用的文本编辑器有很多,这里推荐的有:Vim,Emacs,Atom,VSCode,Notepad++,Sublime Text 3。我们可以多多尝试,用心去感受一下它们各自的特点,然后选一个喜欢的作为自己的主力的编辑器。

除了 Notepad++ 只支持 Windows 之外,它们在 Windows,Linux,Mac 下都有各自的版本。

以上提到的编辑器都支持安装各种插件实现更强大的功能,限于篇幅这里先不说了。

在这里我用的是 Atom(点击进入官网

鉴于国外服务器下载速度较慢的原因,建议从淘宝的 npm 源镜像里面下载最新版 Atom 安装文件,截至这篇文章发表之时它更新到了 1.19.0 版

https://npm.taobao.org/mirrors/atom/

在网页上我们可以看到有一大堆不同平台的安装文件在上面,我们下载 AtomSetup-x64.exe

下载好之后和一般的软件一样打开安装就行,安装好后我们发现桌面多了这个图标。 说明编辑器已经可以用了。

snipaste_20170812_203007.png

GCC编译器的安装

GCC是个跨平台的开源的编译工具链,自然在 Windows 下也会有相应的集成包,一般用的比较多的有 MinGW、MinGW-w64 和 TDM-GCC ,三者的区别和联系可以参考这篇博文,这里我们用TDM-GCC。

ps: Code::Blocks、Dev-C++ 软件默认也是使用 GCC 编译器的

打开TDM-GCC的官网 ,点击中间的 "TDM64 bundle" 下载安装包,运行安装包

点击 Create,开始一个新的安装

snipaste_20170812_210217.png

我们用的基本都是64位的电脑,当然是选择64位啦。

snipaste_20170812_210354.png

一路Next就可以了

Clipboard_20170812.png

Clipboard_20170812 (1).png

整个安装向导跑完之后,GCC 编译器就已经在你的电脑上了,我们知道,这是个在命令行下运行的程序,没有图形界面。

我们先验证一下 GCC 有没有安装好。

首先随便打开一个文件夹(桌面也可),按住 shift 键,右击空白处,你会发现右键菜单多了一项“在此处打开命令窗口”,如果你更新了 Windows 10 的最新更新,你看到的会和截图一样,打开的是 PowerShell ,没关系!两个东西除了界面和一些具体的功能不一样,用起来是差不多的。

snipaste_20170813_002714.png

打开之后我们发现它提示了我打开的文件夹的路径,后面可以通过键盘输入文字,意思是接下来的命令是基于这个文件夹进行的。

我们在里面输入 gcc 然后回车,如果返回了一个 fetal error: no input files 的错误的话,说明 gcc 已经装好并且能用了。

这是默认的 CMD(ps: CMD 是 Windows 即将落后淘汰但因为兼容性问题不得不保留的东西)

snipaste_20170813_004227.png

这是 PowerShell 的效果

snipaste_20170813_004257.png

如果返回的是“gcc 不是内部或外部命令,也不是可运行的程序或批处理文件。”的话,说明没装好,可能需要重新试一下,或者是通过重启 Windows 来使
tdm-gcc 集成包安装时给系统设置的环境变量生效。

到这里,文本编辑器和编译器已经准备好啦,接下来我再介绍怎么用它们运行代码。

使用方法

写代码

没有了IDE的一键编译代码按钮,自然这些操作都需要手动来,听起来很麻烦的样子?

不用担心!就算是手动,也不会麻烦。

下面让我演示一下在这个环境下,程序是怎么跑起来的。

首先第一步还是先写写源代码,打开 Atom,点击菜单栏的 File > New File 新建一个文本文件,然后File > Save 定位到一个你想用来放代码的文件夹,文件名取一个后缀为 .c 的名字就好。

snipaste_20170813_010116.png

保存之后就可以开始写了,写好再继续保存

snipaste_20170813_010536.png

接下来进入放源代码的文件夹,同样的方法,按住Shift在空白处点击右键,打开命令行窗口

这时候我们运行 gcc 把 first.c 编译成 Windows 可用的可执行文件,命令很简单

gcc first.c

ps: 如果你写的是C++,则需要用 g++ 而不是 gcc ,假定源文件是 first.cpp

g++ first.cpp

输入完后回车,这时候gcc开始编译你告诉它的文件了,稍等片刻,等这一条命令结束,命令行出现了新的提示符以后,编译就完成了

snipaste_20170813_011103.png

我们可以发现,这个文件夹多了个名为 a.exe 的程序,这就是我们编译好以后可以运行的程序了。

下一步,在命令行里面执行这个程序,输入

.\a.exe

发现 PowerShell 窗口里面输出了我想要它输出的字符串,然后程序结束了,再一次出现了新的提示符

snipaste_20170813_011426.png

爱动脑筋的同学可能会想,既然是个exe那我就不能双击运行么?

当然可以,那就双击打开试试!!

……

打开后发现,它弹出一个窗口,但是我还没看清它就消失了,这是为什么呢?

前文有提到过,我们写的是基于命令行的程序,如果脱离命令行环境直接运行的话,Windows 会创建一个命令行窗口给它提供一个运行的环境,这时候命令行窗口属于这个程序的进程。这个程序启动后,执行完向命令行打印字符的操作,告诉系统,我已经顺利执行完毕啦,于是它的生命周期结束。自然,系统要把它之前申请的资源都回收利用起来,包括那个弹出的命令行窗口,于是系统销毁了那个弹出来的命令行窗口。

当程序在命令行下运行时候,程序使用的命令行窗口属于执行它的命令行窗口的进程,程序退出以后,命令行实际还是在运行的,因而窗口不会销毁,程序留下的记录仍然可以得到保留。

有没有一种双击打开程序不让命令行窗口一闪而过的方法呢?答案是肯定的。如果我们能让程序运行的时候停留在某个步骤不动,那么它就可以保持不退出啦,一般在 Windows 下我们常用的暂停语句是 system("pause"); ,这个语句是通过执行命令行的 pause 命令来实现让程序暂停的功能(和你在命令行输入 pause 回车一样的效果),程序执行到这一步,提示“按任意键继续”,程序暂停,当你按任意键以后,程序继续向下执行,就不会那么快退出了。

错误处理

如果源代码有语法错误的话,编译时编译器会报错并且不会生成目标代码。

这里我故意把第5行最后的分号删掉,再运行 gcc 命令编译,提示第六行第五个字符的 return 之前少了分号,编译失败。

snipaste_20170813_011925.png

错误定位办法参考师兄的文章

至此,我们可以开始愉快地练习代码啦!

这里讲两个命令行的小技巧:一是命令行执行过的命令会有历史记录,我们可以通过按上下方向键来切换之前执行过的命令;二是我们填文件名的时候如果它太长了的话,可以先输入前面一小部分,然后按 Tab 键就可以自动补全了。

命令行中还蕴藏着无限的可能,等待着你的探索。

最后

贴一个我在知乎上看到的回答 (原文链接)

snipaste_20170813_014931.png

我想,学习一门编程语言,并不是像我们以前学英语那样,总是研究这个语法那个用法而脱离了实际的应用。我们作为计算机专业的学生,学这些东西并不是像别的专业那样为了考证而学,而是应该把它用起来。一门编程语言的很多特性,和实际的应用和系统的运行紧密相关。仅仅盯着语言的语法,大概会像我身边许多的小伙伴一样,跟着谭浩强学了一年的语法,到现在还是一头雾水。

Windows 系统相对更加强调图形化一些,图形化优势在于直观,简单。但也容易让人迷惑,总是贪图着简单方便,不求甚解,大概会更加地趋于平庸。Linux 强调效率,所以在命令行方面做的是非常地完善好用。

关于命令行和图形化哪个好的问题,需要辩证地看待,各有各的利弊。

使用命令行真的比使用可视化界面好吗?- 知乎

或许有人会说,大家都在用 Windows,VC,我为什么要折腾这些?放眼望去,计算机在不断地高速发展变化之中,而学院的课程总是在“照顾”着大多数人,如果你仅仅只是跟着学院安排的课程,按部就班地学,那是远远不够的。计算机科学是一门自主性非常强的学科。需要锻炼自己的自学能力。希望大家可以多多折腾,互相多多交流,多多进步。

遇到困难的时候,我们有互联网,还有一群热爱折腾的小伙伴们和热心的老师,所以放心大胆地去干吧!

如果有更好的内容需要我补充欢迎在下方留言。

如果有技术上的问题,也同样欢迎在下面的评论区提问。

已有 12 条评论
  1. 那你很棒棒哦。。。(手动斜眼)

  2. 同样推荐 dev-cpp,开箱即用

  3. Clion也可以试试哦。其次你是大学生,可以申请教育免费授权用几年:D(J家的东西就是良心)
    不过atom这货,自从我用vs code后彻底抛弃了他,因为插件实在太难装了,我下载超慢。。。其次我用的那时候,他比较卡。。。

    1. 不过话说,你不安个插件直接在编辑器里面开终端,自动运行代码吗?vs code下有个叫coderunner的插件,可以直接生成命令在编辑器里面开终端运行(需要配置,启用终端,不然默认的窗口是无法输入东西的)atom应该也有吧233

    2. 写的这篇东西,主要是面向一开始接触编程和 C 语言、C++ 的人,初衷是希望大家刚开始上手学编程的时候别一开始就被各种 IDE 惯坏了,主要目的是为了熟悉命令行下的操作而已,一开始抓住最关键的地方,学起来大概就不会太懵逼吧。用的时间长了,自然就会装插件,选择更好更适合的编辑器,亦或者是 IDE 啦,这些细节上的问题并不是重点。

      关于用什么软件的问题,平时我也是用 JetBrains 全家桶,只是说,一开始就上那些封装的比较厉害的东西我感觉不太合适。vscode的确不错,只是我平时还是用 Atom 多一些,也算挺不错的啦。至于插件安装慢的问题,在 ~/.atom/.apmrc 设置一下淘宝源就好了,至于卡嘛,用着 SSD 的我倒是没什么感觉 ;-)

    3. 嘿嘿嘿,我只是推荐一个而已啊233
      IDE什么的,我也用的少,想起了,第一次学Python时,我是拿着vim在手机上连树莓派写的,因为那时没有电脑。。。不过后来PyCharm确实用的爽啊,不过后来我发现了SpaceVim 这个vim扩展包。。。感觉现在写go和py完全可以把IDE扔了,反正我从来都是打log来debug。。。没办法,断点和断言不是很会用,噗,唉不说了。。。我今年高考。。。也已经很久没写代码了。。电脑网什么的早就没了,现在是拿我妈手机,趁着查题时,随便逛逛(所以博客早就弃了,一直没修)。。。上面那个推荐内容也确实是脑袋一热的产物吧233

    4. 仿佛看到了自己当年用手机撸 PHP 的那段岁月。。(这个网站最初就是用手机搭起来的)
      安心准备考试吧,把主动权掌握在自己手上,到时候想怎么折腾都可以了hhhhhhh

  4. mrxiao mrxiao

    你好,请问这款主题能用于typecho开发板吗?此外,我再问一下关于右侧展开栏头像,怎样才能设置成使用本地图片或者外链图片?

    1. 可以的,头像的话你可以去 sidebar.php 找到那个图片的标签的 src 属性换成你想要的图片外链就好了 ;-)

    2. 嗯,好的,谢谢你

添加新评论