第3章
C语言编程的环境搭建
我们在第2章讲述了学习C语言所必需的一些预备知识。本章将给大家介绍常用桌面操作系统下的C语言环境搭建。这里所讲述的C语言编译器以及集成开发环境(IDE)都是可合法免费下载的,本书不鼓励各位使用盗版或破解软件,所以下面会列出下载这些合法免费软件的官方链接,大家把编程环境搭建完之后即可上机实践编程。
3.1 Windows操作系统下搭建C语言编程环境
Windows操作系统下默认不自带任何C语言编译器,大家必须从网上下载自己所需要的C语言编译器。如果各位想通过C语言开发Windows系统平台相关的应用,或者主要想在Windows平台对C语言程序进行调试,那么往往首选Visual Studio Community。这款开发环境是免费的,里面自带了微软自家的C语言编译器——简称为MSVC。不过当前MSVC无法支持最新的C11标准新特性,而且即便是C99标准也是支持得比较有限,所以它并不适合学习C11最新标准。但对于C语言初学者而言,这款集成开发环境还是非常适合的。幸运的是,2017年3月微软最新推出的Visual Studio Community 2017包含了Clang编译器前端工具,如果我们勾选安装的话即可使用Clang来作为C语言编译器。尽管Visual Studio下的Clang编译器尚处于试验阶段,但大部分功能都可用了。目前笔者测试下来,它对原子操作还没支持好,另外像UTF-8、UTF-16等字符编码问题还与Windows操作系统本身相关,所以要涉及这些问题的话,我们只能使用系统特定的接口去解决或者使用下面提到的MinGW以及Clang官方提供的编译工具链去解决。
所以,如果大家想在Windows操作系统下学习更为完整的C11标准最新特性,那么建议下载MinGW,如果是64位的Windows系统的话则最好下载Mingw-w64。如果还想学习Clang编译器语法扩展的话,也可以再下载单独的Clang编译器。
3.1.1 安装Visual Studio Community 2017
Visual Studio Community最新版本可在微软的Visual Studio官方网站下载:
https://www.visualstudio.com/thank-you-downloading-visual-studio/? sku=Community&rel=15。
当我们下载好Visual Studio Community的安装程序之后,将它打开运行。随后会看到一个选择安装组件的对话框。我们在该对话框的右侧能看到已经勾选上的组件以及一些没有勾选上的组件。这里我们必须勾选上“Clang/C2(实验)”这一项,如图3-1所示。因为不安装Clang,后面就无法用它编译C源代码。
图3-1 Visual Studio Community安装界面
安装完成之后,我们打开Visual Studio Community 2017,首先出现欢迎界面。Visual Studio在首次启动时就会很明显地提示我们注册账号或用账号登录。我们先用Hotmail或MSN账号登录注册,如果不注册仅有30天左右的试用时间,但一旦注册完之后就能永久使用了。我们登录完自己的账号之后就可以开始新建一个C语言的项目工程了。
我们找到菜单栏最左边的“文件”,然后选择“新建”,再点击“项目”,如图3-2所示。
图3-2 欢迎界面中新建项目
随后我们会看到新建项目的对话框。在左侧边栏中找到“Visual C++”,然后选中“Win32”,随后在中间栏选择“Win32 Console Application”,最后,在底下输入此工程创建后存放的目录路径以及工程名,如图3-3所示。
图3-3 Visual Sutdio新建项目
点击“OK”按钮后进入应用设置向导界面,如图3-4所示。
图3-4 Visual Studio应用设置向导
我们看到图3-4这个界面时,先别着急点击“下一步”按钮,应先点击左边边栏中的“应用程序设置”,对此进行初步配置。然后进入图3-5所示的界面。
图3-5 Visual Studio项目创建时的应用设置
图3-5所示的界面中,在“附加选项”中,先取消勾选“预编译头”,然后勾选“空项目”。最后,点击“完成”按钮进入到我们所创建的cdemo项目工程的主界面。此时,整个工程是空的,只有文件夹而没有任何文件,需要手工新建C源文件。用鼠标右键单击“源文件”,选择“添加”,然后再点击“新建项”,如图3-6所示。
图3-6 Visual Studio添加C源文件
在随后弹出的如图3-7所示的对话框中,选中中间栏中的“C++文件(.cpp)”那一项,然后在底下“名称”一栏输入源文件名。
图3-7 Visual Studio命名C源文件名
注意:这里需要注意,默认文件后缀名是.cpp,即C++源文件,因为Visual C++默认采用C++编程语言,因此我们这里要手工填写.c文件后缀名,使得后续我们用C编译器进行编译构建整个控制台应用。
完成之后,我们点击“添加”按钮,然后再次进入工程主界面,此时即可看到C源文件的编辑界面了。
我们在进入源文件编辑界面后,先对Visual Studio的文本编辑选项做些处理,以便于我们后续可以流畅地编写代码。如图3-8所示,我们在上面的菜单栏找到“工具”,然后选择“选项”。
图3-8 Visual Studio准备设置编辑选项
点击进入后能看到如图3-9所示的对话框。在左边栏找到“文本编辑器”这个选项,然后将它展开,选中“所有语言”,随后我们勾选上“行号”,这样,在编辑每个文本文件时都能看到行号,便于我们查找代码中的语法错误以及调试代码用。
图3-9 设置编辑选项
最后,再选中“制表符”选项,对制表符进行设置,如图3-10所示。习惯上,我们一般将Tab Size设置为4个半角字符,缩进大小也是4个半角字符,然后每个制表符用4个空格代替,这样用其他编辑器浏览Visual Studio编辑过的源文件也不会导致格式错乱。
图3-10 Visual Studio设置制表符
接下来我们设置当前的项目工程的属性选项。我们找到菜单栏的“项目”,然后点击“cdemo属性”,如图3-11所示。
图3-11 Visual Studio设置项目属性
在配置界面的常规页面中(见图3-12),先找到左上角的“配置”选项,选择“所有配置”。这样,我们后续做的所有配置都对Debug模式与Release模式同时有效。然后,在右侧找到“平台工具集”,这里需要选择使用“Visual Studio 2017-Clang with Microsoft CodeGen”,这个选项使得我们对当前的项目工程使用Clang编译工具链进行编译构建。
图3-12 Visual Studio对cdemo项目工程的常规设置
随后我们展开C/C++这一项,此时仍然需要先将左上角的“配置”设置为“所有配置”。然后找到“语言”,将“C语言标准”设置为GNU11标准。这样我们就能在Visual Studio Community集成开发环境下编写调试大部分基于GNU11标准的C语言代码了。设置如图3-13所示。
图3-13 Visual Studio设置C语言标准
全都设置完成之后,我们就可以编写第一个C语言程序了。同一般C语言教程一样,我们这里也通过输出一个“Hello, world! ”字样,作为第一个C语言代码的演示程序。我们输入图3-14中所示的代码,然后点击工具栏中的绿色三角箭头(图3-14中用矩形框圈出)即可编译运行了。在程序最后的getchar()作用在于:弹出的控制台应用不会在程序终止时马上自动关闭,而是等用户输入一个回车时再关闭。
图3-14 在Windows控制台输出字符串
在图3-14所示的界面中,椭圆圈出来的部分用于设置当前程序以调试模式构建还是以发布模式构建。如果以调试模式构建,我们可以利用Visual Studio内建的调试器做断点跟踪,查看局部对象与全局对象状态以及寄存器状态等,便于调试程序。如果以发布模式构建,那么当前程序会被大幅优化,使得程序运行性能大幅提升,但难以调试。图3-14中,中间用矩形框圈出的部分是设置当前目标程序的执行模式,默认为x86,即32位执行模式。这里我们将它设置成了64位执行模式。
3.1.2 安装MinGW编译器
MinGW编译器是著名开源C语言编译器GCC对Windows操作系统的一个移植版本。通过MinGW,我们就可以在Windows下享用大部分GCC编译器所带来的强大功能了。这对跨平台的C语言开发而言十分有用。下面我们就来介绍如何下载安装MinGW编译器。
首先,我们直接进入这个网址下载安装文件:http://sourceforge.net/projects/mingw/files/latest/download?source=files。这个文件非常小,因为MinGW采用的是在线安装模式,萃取线上各个最新release版本的组件进行下载。
然后,我们双击安装包,初步安装完毕后弹出对话框如图3-15所示。绿色进度条表示已经安装好了。
图3-15 MinGW初步安装成功
我们点击“Continue”按钮后,出现选择安装更多组件的对话框。我们在左侧栏点击“Basic”,即采用基本安装。然后,在右侧栏安装上全部列出的组件。要选中某个安装组件,鼠标右键该包名,然后在快捷菜单中选择“Mark for Installation”命令,如图3-16所示。
图3-16 MinGW安装,选中安装包
全都选择好之后,我们最后更新刚选好的安装包。我们在菜单栏选中“Installation”,然后点击“Update Catalogue”,如图3-17所示。
图3-17 MinGW更新安装包
之后会弹出如图3-18所示的界面,点击最左边的“Review Changes”按钮,会弹出如图3-19所示的对话框。
图3-18 MinGW安装要求确认
图3-19 MinGW安装更新
点击“Apply”按钮之后,就会下载安装设置更新后的安装包。等待全都安装完毕后,点击“Close”按钮,退出整个安装程序。
安装结束后,不要着急使用,而是先将MinGW的bin文件夹注册到环境变量中。先打开“文件资源管理器”,在左侧栏中找到“此电脑”或“我的电脑”,鼠标右键单击它,选择“属性”,进入后点击左侧的“高级系统设置”,如图3-20所示。
图3-20 进入环境变量的设置界面
进入图3-20的对话框之后,点击“环境变量”按钮,进入到“环境变量”对话框。我们在“系统变量”区域选中“Path”变量,然后点击“编辑”按钮,弹出“编辑系统变量”对话框。在“变量值”中往后添加刚才安装后的MinGW中的bin文件夹所在目录。在环境变量中的每个值之间用半角分号“; ”进行分隔,如图3-21所示。
图3-21 进入环境变量设置Path
完成之后,我们就可以打开控制台程序(方法是右键桌面上左下角“开始”按钮,然后选择命令提示符),然后进入要编译的C源文件所在的目录。然后用gcc命令对指定C源文件进行编译构建,如图3-22所示。
这里,我们借用之前在Visual Studio Community下编辑好的源文件test.c。我们先用cd命令定位到test.c所在的目录。然后用gcc --version命令查看当前GCC编译器的版本。最后,用gcc -std=gnu11 test.c进行编译,最终在当前目录生成a.exe可执行文件。我们直接键入a,回车,即可看到程序输出结果。
要注意的是,MinGW是32位的C语言编译器,所以它构建出来的程序也是32位的。如果各位用的Windows操作系统是64位的,那么可以使用Mingw-w64编译器。下载地址如下:https://sourceforge.net/projects/mingw-w64/files/latest/download?source=files。
Mingw-w64的安装、设置过程与32位的MinGW类似,这里不再赘述。
3.1.3 安装LLVM Clang编译器
LLVM(Low Level Virtual Machine)起源于一个大学项目,它是一个编译器基础架构项目,用于设计一组具有良好定义的、可重用的库。LLVM起先用于替代GCC(这里的GCC是指GNU Compiler Collection)栈中的代码生成器,然后对GCC中已有的许多编译器进行修改以适配LLVM。后来LLVM发起了开发一个全新的适用于不少编程语言的编译器前端,称为Clang。Clang主要支持C、C++、Objective-C等编程语言,并且主要由Apple公司大力支持和维护。LLVM与Clang都基于BSD许可证,比GPL更宽松。正因如此,现在许多硬件商都逐渐开始投入对LLVM的支持,像Khronos开放标准组织也基于LLVM IR(Intermediate Representation)开发出了自己的一套SPIR-V。Clang编译器在语法上力争支持各大主流编译器的语法扩展,包括GCC和MSVC,所以微软也已经把Clang纳入Visual Studio集成开发环境的工具集中。
图3-22 用GCC构建C程序
我们首先在LLVM Clang官网下载最新稳定发布版本的Clang安装包:http://llvm.org/releases/download.html。然后,要注意的是选择32位版本,如图3-23所示。
图3-23 下载Clang for Windows (32-bit)
由于Clang主要是一个编译器前端,因此它需要依赖其他编译器的连接器以及某些运行时库。所以,我们光安装Clang是无法直接成功构建应用程序的,因而我们要使用Clang的话,必须在此之前先把MinGW安装好。MinGW是32位的,因此为了二进制兼容,我们所选取的Clang也必须是32位的。当然,如果之前安装的是64位的MingW-W64,那么这里需要下载安装64位的Clang。
安装Clang的过程非常简单,可根据安装向导简单地做些选择即可完成安装。安装完成后,可以去“系统”里的环境变量中看,把LLVM目录下的bin文件夹的路径添加到Path环境变量中,如图3-24所示。然后就可以再次使用命令行工具直接编译运行程序了。
图3-24 用Clang编译器构建应用程序
3.2 macOS系统下搭建C语言编程环境
macOS系统也不默认自带C语言编译器。然而,用户可以自己去Mac App Store免费下载macOS下的强大开发工具——Xcode:https://itunes.apple.com/cn/app/xcode/id497799835? mt=12。该集成开发工具采用Apple定制版本的Clang编译器,称为Apple LLVM编译器。它自带C、C++、Objective-C以及Apple自己新推出的Swift编程语言编译器,还有一系列功能强大的代码静态分析以及性能剖析工具。
下载完Xcode之后,把它打开。如果是第一次启动,Xcode会自动更新一些资源,完了之后弹出主界面,如图3-25所示。
图3-25 Xcode欢迎界面
我们选择第二个选项,点击它即可创建应用程序工程。第一个选项仅用于操练把玩Swift编程语言,而第二个选项用于创建真正的应用或库。当然,有些应用可直接提交到App Store审核,有些则不行。
点击“Create a new Xcode project”之后,出现图3-26所示的对话框。在图3-26中,我们看到在上面一栏中所选的项目工程为macOS的应用。然后在下边,我们选择“Command Line Tool”,即命令行工具。最左边的Cocoa Application用于创建macOS系统上基于GUI以及沙盒机制的应用,它可以上传到Mac App Store。中间的“Game”专门用于游戏应用,也可上传到Mac App Store。而最右边的“Command Line Tool”构建出来的应用则无法上传到Mac App Store,但是它能访问macOS的整个文件系统,并且没有采用沙盒机制。另外,开发者用Command Line Tool开发出来的应用也可以直接放到网上供其他人下载使用。
图3-26 选择MacOS命令行工具应用项目
我们点击“Next”按钮之后出现如图3-27所示的对话框。在第1行用英文输入自己的产品名称,这个后面将用于自动生成的工程名称。然后第2行填写组织名。第3行填写组织标识,格式为com.<公司名>.<产品名>。当然,第2、第3行对于我们的demo而言可以随意填写。第5行我们要选择C,表示使用C语言。
图3-27 输入macOS命令行应用的属性
点击“Next”按钮可看到图3-28所示的目录选择对话框。
图3-28 macOS命令行应用生成目录选择对话框
这里选择将新创建的项目工程放到哪个目录下。另外,这里要注意的是,我们不要勾选“Create Git repository”这一选项。因为它会在工程本地做git版本管理,对于我们一般应用而言没有任何必要,而且这会随着工程构建的次数增多而增大,很占磁盘空间。而且如果要将本地工程拷贝到其他环境,也会带来许多不便。我们最后点击“Create”按钮之后,工程就会被创建好。
工程被创建完之后,Xcode默认会打开,包括会自动创建一个main.c的C语言源文件。此时,我们不用着急编辑、运行,可以先设置一下编译选项。
我们首先点击蓝色的“CDemo”项目工程图标,然后点击中间一栏“TARGETS”下的“CDemo”控制台图标,最后在右边栏的最上方选中“Build Settings”,然后在下面选中“All”和“Combined”。随后,我们找到“Apple LLVM x.x-Language”这一栏,将“C Language Dialect”选为gnu11,这个选项将贯穿本书内容。到此,我们的C语言编译选项就设定好了,如图3-29所示。
图3-29 macOS项目设置工程配置选项
如果我们想对最终生成的代码再做一些优化,可以设置图3-30中的一些选项。
图3-30 macOS项目设置其他编译选项
我们将C++的异常以及运行时类型(RTTI)全都关闭,另外也将Objective-C的异常关闭。这样,最终的应用程序中将不会包含异常栈,同时,编译器后端优化也能更省力不少。大家可以观察到,将这几个选项关闭后,最终生成的可执行文件会比开启时要小一些。
最后,我们可以设置一下Xcode自身的偏好设置,将行号显示出来,如图3-31所示。
图3-31 打开Xcode偏好设置
我们在菜单栏上,选择“Xcode”,然后点击“Pre-ferences...”,弹出图3-32所示的对话框。我们把“Line numbers”勾选上即可在文本编辑框中看到行号。另外,Xcode默认字符编码已经是UTF-8了,因此不需要我们做额外的设置。
图3-32 Xcode设置文本编辑属性
由于Xcode默认字体可能会显得比较小,因此如果想设置字体以及背景颜色的话可以选择“Fonts & Colors”选项。
在进入到此对话框后,我们点击左侧栏下边的“+”号,添加一个新的字体,并且选择“Duplicate‘Default'”,如图3-33所示。这使得我们所新增的字体以默认字体和颜色作为基准,然后对它做大小修改。
图3-33 Xcode字体设置,添加新字体
如图3-34所示,我们这里新增了一个叫“Defualt_Big”的字体,然后在中间这栏,我们先选中“Plain Text”,然后将滚动条滚动到最下方,按住Shift键再选中最后一条“Other Preprocessor Macros”,这样可以将所有种类的文字格式全都选中,随后我们点击“T”字样的按钮来调整这些文字格式的字体大小。这里,原先的字体大小为“Menlo Regular-11.0”,设置之后这里变为“Menlo Regular-14.0”。
图3-34 Xcode设置新字体格式与大小
现在,我们就可以直接运行Xcode自动帮我们生成好的main.c中的C源代码了。我们直接点击右上角的三角箭头按钮即可编译并运行这段代码,如图3-35所示。
图3-35 编译运行macOS控制台应用
我们在下面的调试控制台中能看到图3-35这两行文字。其中,最后一句是应用退出后系统自动打印的。我们可以看到,macOS下能非常轻松地直接输出中文,而不需要各种复杂的编码转换。
图3-36 macOS控制台程序运行结果
3.3 本章小结
本章主要讲述了Windows操作系统下如何使用Visual Studio Community、MinGW和LLVM Clang进行C语言程序开发,同时也讲解了如何在macOS下使用Xcode做C语言程序开发。因为Windows操作系统与macOS系统用得比较广泛,而且它们都主要基于GUI的集成开发环境进行编程,所以我们做重点讲解。而在各个版本的Linux下基本都默认安装了GCC编译器,各位可以直接在Linux系统下的命令行终端使用gcc命令对C语言源文件做编译构建。而当前FreeBSD最新发布版本默认使用了LLVM Clang编译器,各位也可以直接在命令行终端使用clang命令对C语言源文件做编译构建。
另外,Linux、FreeBSD系统下,笔者推荐使用的集成开发环境是Eclipse。它拥有比较基本的代码智能感知,设置断点进行调试的功能,而且它也是一款开源免费的软件。当然,要启动Eclipse必须先下载JRE(Java Runtime Environment),这个可以从Oracle官网下载。
截至本章,第一部分的讲解结束,各位读者应该对C语言的由来、用途以及各种准备工作都了解得差不多了吧?下面我们将进入第二部分,正式开启C语言魔法的大门!