
1.1 开发环境搭建
1.1.1 C语言的那些事
在搭建开发环境之前,这里先讲一个故事。C语言为什么叫C语言呢?其实是因为先有高级语言ALGOL 60(简称A语言),后来它经过简化变为BCPL语言(改进后称为B语言),而C语言是在B语言的基础之上发展而来的,所以就称为C语言。因此,世界上的第一个C语言编译器是用B语言编写的。目前,主流的编译器是微软公司的Visual Studio使用的masm编译器和Linux使用的gcc编译器(Mac计算机也使用这个编译器)。学习一堆关于C的版本及标准意义不大,关键是要掌握编译器支持的语言特性。
在接下来的8章中,我们所讲的C程序无论是在Windows上还是在Linux或Mac OS上,都可以编译通过。
1.UNIX
1965年前,计算机并不像今天这样普遍,它不是普通人能用得起的,除非是军事机构或学院的研究机构。当时,大型主机最多能支持30个终端(30个键盘、显示器),其连接方式如图 1.1.1所示。
为了解决终端数量不够用的问题,1965年前后,贝尔实验室加入麻省理工学院和通用电气公司的合作计划,以便建立一套多用户、多处理器、多层次的 MULTICS 操作系统,让大型主机支持300个终端。
1969年前后,该项目进展缓慢,资金短缺,贝尔实验室于是退出了研究。1969年8月,从这个项目中退出的Ken Thompson为了能在实验室中一台空闲的计算机上运行“星际旅行”(Space Travel)游戏,在妻子探亲的1个月时间内,使用汇编语言编写了UNIX操作系统的原型。

图1.1.1 大型主机的连接方式
1970年,Ken Thompson以 BCPL语言为基础,设计出了很简单且很接近硬件的 B语言(取BCPL的首字母),并且用 B语言编写了第一个UNIX操作系统。
1971年,同样酷爱“星际旅行”游戏的 Dennis M.Ritchie 为了能早一些玩上这款游戏,加入了Ken Thompson的开发项目,合作开发UNIX操作系统。他的主要工作是改造 B语言,因为B语言的跨平台性较差。
1972年,Dennis M.Ritchie 在 B语言的基础上最终设计出了一种新的语言,他以BCPL的第二个字母作为这种语言的名字,这就是 C语言。
1973年初,C语言的主体完成,Ken Thompson和Dennis M.Ritchie(见图1.1.2)迫不及待地开始用它完全重写了现在大名鼎鼎的UNIX操作系统。

图1.1.2 Ken Thompson(左)和Dennis M.Ritchie(右)
2.C语言
在把UNIX操作系统移植到其他类型的计算机上使用时,C语言强大的移植性得以显现。机器语言和汇编语言都不具有移植性,为x86开发的程序,不可能在Alpha、SPARC和ARM等机器上运行。而C程序则可以在任意架构的处理器上使用,只要这种架构的处理器具有对应的C语言编译器和库,将C源代码编译、链接成目标二进制文件后即可运行。
有些读者可能会问,“Java语言的跨平台是怎么一回事?”其实,使用Java语言编写的任何代码,无须修改即可在任何一个平台上运行,因此我们将其称为跨平台语言。C语言的可移植性强,但不能跨平台,为什么?我们所讲的C标准,当然可以通过不同的编译器编译后在任何一个平台上运行。但是C标准除文件操作外,并未涉及操作系统硬件资源的接口,如进程调度、网络通信等,这些接口均是每个操作系统独有的,因此Windows与Linux的这些接口有差异。一旦C程序中使用了这些接口,将代码放到另一个平台上就无法编译通过。那么是不是C语言不如Java语言呢?其实不然,Windows操作系统本身是用C和C++(及少量汇编)语言开发的,Linux是用C(和少量汇编)语言开发的,C语言的执行效率在高级语言中一直位居第一!另外,Java语言及其他脚本语言中没有指针,无法访问物理地址,所以系统中的驱动都要用C或C++语言进行编写。
1.1.2 开发环境安装
在接下来的8章中,我们使用的开发环境为Microsoft Visual Studio 2012(简称VS 2012),也可用VS的其他版本,如VS 2013到VS 2017。读者既可以到网上下载安装包,又可以加入前言中给出的QQ群(其中提供了安装包的分享链接)。为什么要使用VS 2012来讲解C语言呢?因为相对于Linux下的gcc,VS 2012的图形化调试界面清晰直观,对于初学者非常友好。那么为什么不用VS的最新版本呢?因为最新版本中添加了我们学习C语言时暂不相关的其他功能,而我们学习C语言的目的是能够到Linux下进行系统开发,所以不使用最新版本完全没有影响。操作系统为Windows 10的读者,可以选择安装VS 2017,具体使用方法见QQ群中的视频。
下面介绍安装VS 2012的步骤。
(1)在Windows 7操作系统下无法直接打开ISO映像的读者,要先安装DAEMON Tools Lite虚拟光驱(如果计算机中已经安装了其他虚拟光驱,那么也可以使用对应的虚拟光驱)。DAEMON Tools Lite安装包可以到QQ群中下载,或到百度中自行下载。下载DAEMON Tools Lite安装包后,运行安装程序,进入如图1.1.3所示的界面,选择相关选项后,单击“下一步”按钮。

图1.1.3 DAEMON Tools Lite安装向导界面
(2)安装完成后,出现如图1.1.4所示的界面,单击左下方带方框的加号按钮添加Microsoft.Visual.Studio.2012.Ultimate.CHS映像。
(3)如图1.1.5所示,在出现的界面中单击三角形按钮载入映像。载入映像后,双击箭头指向的图标,即可打开iso安装包,如图1.1.6所示,双击vs_ultimate即可开始安装。对于无法安装DAEMON Tools Lite虚拟光驱的读者,可以试一下其他虚拟光驱;另外,Windows 10操作系统可以直接解压缩iso安装包进行安装,而不用安装DAEMON Tools Lite虚拟光驱。

图1.1.4 单击左下方带方框的加号按钮添加Microsoft.Visual.Studio.2012.Ultimate.CHS映像

图1.1.5 载入映像并打开iso安装包的界面

图1.1.6 双击vs_ultimate开始安装界面
(4)在出现的界面中,如图1.1.7所示,选中“我同意许可条款和条件”选项后,单击“下一步”按钮。如果C盘中的可用空间小于10GB,那么建议选择其他盘进行安装。在出现的对话框中,如图1.1.8所示,选中所有选项后单击“安装”按钮开始安装。这里建议在安装过程中不要安装其他软件,以免安装失败(分区是固态硬盘时,可以选择安装的固态硬盘分区,这样启动速度会非常快)。安装完毕后,在出现的界面中,如图1.1.9所示,单击“启动”按钮,出现如图 1.1.10所示的界面,界面中提示输入产品密钥。由于微软社区版对个人免费,因此可在百度中直接搜索Visual Studio Ultimate 2012的密钥,搜索到后复制并粘贴即可。激活成功后,会显示如图1.1.11所示的界面,单击“关闭”按钮。单击按钮后,显示如图1.1.12所示的界面,选中“Visual C++开发设置”选项后,单击“启动Visual Studio”按钮。单击按钮后,需要几分钟的时间进行配置,请耐心等待。

图1.1.7 同意许可条款和条件及安装位置界面

图1.1.8 选择安装选项界面

图1.1.9 安装已完成界面

图1.1.10 输入产品密钥界面

图1.1.11 成功应用产品密钥界面

图1.1.12 “选择默认环境设置”界面
安装VS 2017时,安装过程中会出现如图1.1.13所示的提示界面,选择“使用C++的桌面开发”选项和“通用Windows平台开发”选项。

图1.1.13 安装VS 2017时的提示界面
如果计算机中有固态硬盘,并且空间足够大,那么建议将开发环境安装到固态硬盘上,这样可以提升开发环境的启动速度,对任何集成开发环境其实都是如此(无论是Java还是Python等语言的集成开发环境,安装到固态硬盘上都有助于提升启动速度)。