购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2
入门

那么,我们该如何开始呢?与任何编译语言一样,我们首先需要一个包含一些有效C语言指令的文件。然后,我们需要一个能翻译这些指令的编译器。有了正确的文件内容和适合自己计算机硬件的编译器,你就可以在几分钟内运行一个C程序。

如果学习过计算机语言,那么你很可能对“Hello,World”程序的想法并不陌生。这是一个令人钦佩的简单想法:创建一个小程序,一次性证明几件事。它能证明你能用这门语言写出有效的代码,证明你的编译器或解释器可以正常工作。它还能证明你能生成可见的输出结果,这对人类来说非常有用。让我们开始吧!

1.2.1 所需工具

如今,人们使用计算机完成大量任务。游戏和流媒体视频等娱乐任务占用的CPU周期与业务工作甚至应用程序开发占用的CPU周期一样多。由于计算机既用于消费,也用于生产,因此很少有系统配备应用程序开发所需的工具。令人欣慰的是,这些工具都是免费提供的,但你必须自己去获取它们,然后将它们设置为在你的系统上运行。

正如我之前指出的,本书的重点是编写简洁、高效的C代码。在我们的示例中,我注意避免过于巧妙的模式。我还努力确保示例不依赖于特定的编译器或特定的开发平台。为此,我将使用软件开发所需的最低配置:一个好的编辑器和一个好的编译器

如果你喜欢在网上搜索软件,并希望直接参与其中,我们将安装微软的Visual Studio Code(通常简称为“VS Code”)作为我们的编辑器,并安装GNU基金会的GNU开发者工具来处理编译工作。后面还有更多链接和详细信息,但如果你自己安装了这些工具,或者你已经有自己喜欢的编辑器和编译器,请随时跳转到1.2.2节阅读。

Windows

微软Windows在台式机市场上占有很大份额。如果你只为一个系统编写程序,Windows会让你得到最大的实惠。但这也意味着,在帮助你编写程序的软件方面,竞争会更加激烈。Windows的商业开发者应用程序比其他任何平台都要多。幸运的是,其中许多应用程序都有免费或“社区”版本,足以满足我们的需求(当我们在本书的第二部分重点讨论Arduino时,我们将了解一些包括编译器在内的Arduino专用工具)。

谈到Windows和软件开发,就不能不提到微软的Visual Studio IDE(集成开发环境)。如果你想为Windows本身构建应用程序,Visual Studio是你的不二之选。这两个版本甚至还为学生和个人开发者提供了社区版。虽然我不会在本书的示例中讨论这两个版本,但Visual Studio对于Windows用户来说是一个很好的集成开发环境,可以轻松处理我们的代码(不过,我将在三大平台上使用一个名为Visual Studio Code的近亲作为我们的编辑器)。

另一个流行的商用集成开发环境是Jetbrains公司的CLion。CLion也是跨平台的,因此你可以轻松地在不同的操作系统之间移动,而且仍然感觉高效。如果你有使用Jetbrains公司其他优质应用程序的经验,CLion将是你开始编写和调试C代码的熟悉方法。

还有许多其他文本编辑器,它们各有利弊。你甚至可以使用内置的记事本程序等工具,不过专门针对编程的编辑器会有一些方便的功能,能让你更轻松地阅读和调试代码。

Windows上的GNU工具。 在Windows上,安装GNU的GCC工具可能有点烦琐。没有快速、友好的安装程序 [1] 。你可以找到各种二进制包,它们提供了我们所需的大部分功能,但你仍需注意下载GNU编译器子包,然后配置Windows环境。

我们将安装Cygwin环境,以获得Windows版本的GCC。Cygwin是一个强大的工具和实用程序集合,为Windows用户提供了一个不错的Unix shell环境。不过,“不错”这个词很主观,如果你不了解Unix或其衍生工具(如Linux或现代macOS),你可能用不到这套工具中的其他工具。

获取Cygwin安装可执行文件。下载完成后,启动它。你可能需要“允许这个来自未知发布者的应用程序对你的设备进行更改”。你可以尝试“从互联网安装”选项,但如果有任何问题,请返回并使用“下载而不安装”选项。你仍然需要按照软件包选择步骤进行操作,但下载完成后,你可以第二次运行安装程序,选择“从本地目录安装”选项,并使用下载所有软件包的文件夹。

对于安装程序提出的任何问题,请接受默认值。进入镜像站点选择页面后,如果能找到你认识的大学或企业,请使用离你最近的镜像站点。否则,任何镜像站点都可以,但如果在下载过程中遇到任何问题,也可以回来选择不同的镜像站点。

在“Select Package”(选择软件包)屏幕上,由于默认情况下不包含gcc,所以需要额外选择。将“视图”下拉菜单切换到“完整”,然后输入“gcc”作为搜索词。你需要图1-1中突出显示的“gcc-core”软件包。任何可用版本都能满足我们的需要。在撰写本书时,我们选择了最新的gcc-core版本,即10.2.0-1。

图1-1:选择Cygwin GCC软件包

在“审核”页面上确认你的选择,然后开始下载。下载和安装可能需要一点时间,但你最终会看到“完成”页面。如果你想使用类似Unix的命令提示符,可以添加桌面图标,但我们的工作并不需要它。不过,在微软的命令提示符中添加Cygwin工具还需要额外的步骤。

你可以上网搜索关于创建和编辑Windows环境变量的指南,但这里有一些基础知识(如果你以前做过这类工作,可以跳过Cygwin文件夹的选择,直接将其放入路径中)。

从“开始”菜单中搜索“env”,很快就能在顶部看到“编辑系统环境变量”(Edit the system environment variables)的选项,如图1-2所示。

图1-2:在Windows中查找环境变量编辑器

打开“系统属性”(System Properties)对话框,单击右下角的“环境变量...”(Environment Variables...)按钮,如图1-3所示。

图1-3:Windows中的“系统属性”对话框

你可以只设置自己的路径,也可以将其设置为整个系统的路径。选中要更新的PATH条目,然后单击“编辑”(Edit)。接下来,在“编辑环境变量”对话框中单击“新建”(New)按钮,然后单击“浏览”(Browse...)按钮导航到Cygwin bin 文件夹,如图1-4所示(如果你还记得为Cygwin安装程序选择的放置所有内容的根文件夹,当然也可以直接键入)。

图1-4:在路径环境变量中添加Cygwin bin 文件夹

单击“确定”(OK)按钮关闭每个对话框,然后就设置好了。

关于编辑器,你可以在Visual Studio网站上找到VS Code。根据你的系统,你很可能需要64位或32位用户安装版本 [2]

使用图1-5所示的扩展视图抓取C/C++扩展。你可以搜索简单的字母“c”,也可以在“热门”(Popular)列表中立即看到该扩展。单击该扩展的绿色安装按钮。

让我们测试一下这些Cygwin工具中的GCC工具(可能需要重启Visual Studio Code才能识别Cygwin工具)。从“视图”(View)菜单中选择“终端”(Terminal)选项。终端选项卡应在底部打开。你可能需要按Enter键来获得提示。在提示符下运行gcc--version。希望你能看到与图1-6类似的输出。

图1-5:VS Code中的C扩展

图1-6:在终端选项卡中测试GCC

你应该能看到与你安装Cygwin时所选软件包相匹配的版本号。如果你看到了,那就太好了!跳转到1.2.2节,开始编写你的第一个C语言程序。如果看不到任何输出或出现“未识别”错误,请查看设置Windows环境变量的步骤。一如既往,上网搜索你所看到的特定错误,可以帮助你解决大多数安装和设置问题。

macOS

如果你主要使用图形应用程序和工具,那么你可能并不了解macOS的Unix基础。虽然你可以对这些基础一无所知,但了解一些命令提示符导航世界的知识还是很有用的。我们将使用终端应用程序下载并安装GCC,但与Windows一样,值得注意的是,苹果的官方开发工具Xcode也可用于编写和编译C代码。幸运的是,我们并不需要Xcode的全部功能就能开始使用C语言,因此我们将只使用最基本的功能。

终端应用程序位于“应用程序”(Application)→“实用工具”(Utilities)文件夹中。启动它。你应该会看到类似图1-7的内容。

图1-7:基本的macOS终端窗口

如果你已经拥有主要的苹果编程应用程序Xcode,你可以快速检查GCC是否也可用。尝试运行gcc-v:

确切的版本并不重要,我们只想确保GCC确实可用。如果没有,你需要安装xcode-select命令行工具,该工具会将GCC一并安装。输入xcode-select--install并按提示操作。对话框会询问你是否要安装命令行工具。回答“是”后,你就可以安装了。

安装完成后,继续运行gcc-v命令,以确保你拥有编译器。如果没有得到很好的回复,你可能需要访问苹果的开发者支持网站,在其中搜索“命令行工具”。

在macOS上安装VS Code要简单得多。访问Visual Studio网站上相同的VS Code下载页面。选择macOS下载。你的标准下载文件夹中应该会收到一个ZIP文件。双击该文件解压缩,然后将生成的 Visual Studio Code.app 文件拖动到“应用程序”文件夹。如果系统提示你输入密码才能将应用程序移至“应用程序”文件夹,请立即输入密码。

重新定位后,继续打开VS Code。我们要添加C/C++扩展,然后检查能否从终端选项卡访问GCC。

在VS Code中单击图1-8所示的“一堆小框”图标,调出扩展面板。你可以搜索简单的字母“C”,很可能在搜索结果的顶部找到正确的扩展。

图1-8:VS Code的扩展

要试用“终端”选项卡,请从“视图”→“终端”菜单项打开它。你应该会在编辑器的底部看到一个新区域。继续尝试在新区域运行GCC检查命令( gcc-v )。你应该会看到与图1-9类似的结果。

图1-9:在macOS的VS Code中试用GCC

同样,如果运行gcc命令没有得到预期结果,请查看苹果公司的开发者网站。你还可以在网上找到一些视频教程,它们可能会对你的特定设置有所帮助。

Linux

许多Linux系统都是为修补者设计的。你可能已经有了GCC。你可以启动终端应用程序,运行与其他操作系统相同的检查程序,进行快速检查。如果 gcc-v 返回的答案不是“Command not found”(找不到命令),那么你就可以下载VS Code了。如果需要安装GCC,可以使用平台上的软件包管理器。你可能会有一个漂亮的图形应用程序来处理这类事情:查找“开发者工具”或“软件开发”,然后阅读说明,看看是否包含GCC或GNU实用程序。

对于Debian/Ubuntu系统,你可以抓取build-essential元软件包,其中包含GCC以及许多其他有用(或必需)的库和工具:

对于Redhat/Fedora/CentOS系统,可以使用Dandified Yum(dnf)工具。在本书中,我们只需要使用GCC:

不过,如果你对软件开发感兴趣,你可能需要“开发工具”组软件包,其中包括GCC和许多其他有趣的东西:

Manjaro是另一款基于Arch Linux的流行Linux发行版。你可以在这里使用pacman工具:

如果你的Linux系统不使用apt、dnf或pacman,你可以轻松搜索“install gcc mylinux ”,或使用系统软件包管理器的搜索选项查找“gcc”或“gnu”。

作为Linux用户,你可能已经有了一些使用文本编辑器编写shell脚本或其他语言的经验。如果你对编辑器和终端已经驾轻就熟,则可以跳过。但如果你是编码新手或者你没有喜欢的编辑器,则可以安装VS Code。访问Visual Studio网站上与其他操作系统相同的VS Code下载页面。获取相应系统的捆绑包(如果你的Linux系统不使用 .deb .rpm 文件,你可以获取 .tar.gz 版本)。

双击下载的文件,系统会提示你进行标准安装。如果要为所有用户安装VS Code,则可能会要求你输入管理密码。不同的发行版会将VS Code放在不同的位置,不同的桌面有不同的应用程序启动器。你也可以使用code命令从命令行启动VS Code。

与其他操作系统一样,我们要添加C/C++扩展,然后检查是否可以从终端选项卡访问GCC。

单击图1-10所示的“一堆小框”图标,调出VS代码中的扩展面板。你可以搜索简单的字母“C”,很可能会在搜索结果的顶部找到正确的扩展。

图1-10:Linux上的VS Code扩展

要试用“终端”选项卡,请从“视图”→“终端”菜单项打开它。你会在编辑器底部看到一个新的区域。继续尝试在该新区域运行GCC检查命令( gcc-v )。你应该会看到与图1-11类似的结果(冗长且略显混乱)。

希望你已经建立并运行了一个简单的C语言开发环境。让我们开始编写代码吧!

1.2.2 创建C语言“Hello,World”

编辑器和编译器就位后,我们就可以尝试许多开发人员用新语言编写的第一个广受好评的程序“Hello,World”程序。这个程序的目的是证明你能用新语言编写有效的代码,并能输出信息。

图1-11:在Linux上的VS Code中试用GCC

作为一种语言,C语言可以很简洁。我们将在第一个程序中详细介绍分号、大括号、反斜线和其他奇怪的符号,但现在请逐字复制这一小段代码。在VS Code中,你可以在左侧的资源管理器中单击右键,或使用“文件”→“新文件”菜单项,或按Ctrl+N键,创建一个新文件。

保存文件并将其命名为 hello.c 。我们还将在VS Code中打开终端(“视图”→“终端”菜单项或Ctrl+`)。你应该会看到与图1-12类似的内容。

如果你已经掌握了其他语言,那么你可能已经猜到发生了什么。无论如何,让我们花一点时间回顾一下每一行。不过,如果其中有些解释让人感到费解,也不用担心。学习编程需要大量的练习和耐心。后面的章节将帮助你强化这两种技能。

这一行加载“标准输入/输出”库的头文件。库(粗略地说)是运行gcc时可以附加到你自己的代码中的外部代码。头文件是对这些外部实体的简洁描述。这是非常普通的一行,代表一个非常普通的库的一个非常流行的部分。除其他事项外,该头文件还包括printf()函数的定义,我们用它来获取实际输出。几乎你编写的所有C程序都会用到它。这一行始终位于文件的顶部,不过正如我们将在第6章中看到的,你通常会使用多个库,每个库都有自己的头文件#include行。

图1-12:“Hello,World”和我们的终端选项卡

复杂的程序可能有数十个(甚至数百或数千个)独立的C语言文件。将大问题分离成更小的部分是成为优秀程序员的基本要素。这些较小的“部分”更容易调试和维护。它们还能帮助你找到重复任务的时机,从而重复使用你已经编写的代码。但无论你的程序是庞大、复杂,还是微小、简单,你都需要一个起点。这一行就是起点。main()函数始终是必需的,尽管偶尔看起来会有些不同。我们将在第2章讨论像该行开头的int这样的类型,并在第5章更仔细地研究函数。但请注意行尾的{。这个字符打开了一个代码块。

这条语句是我们程序的核心,它代表main()函数块的主体。代码块包含一行或多行代码,这些代码(在C语言中)以大括号为界,我们通常将代码块的内容称为其主体。这个特殊的正文只做了一件事:使用printf()函数(同样定义在 stdio.h )生成一个友好的全局问候语。我们将在2.3节更详细地介绍printf(),以及类似"Hello,world\n"这样的代码段。

我还想快速强调行尾的分号。这个标点符号会告诉C编译器何时完成一条语句。在我们的代码块中只有一条语句的情况下,这个标点符号的意义并不大,但当我们有更多的语句或语句杂乱到需要跨几行时,它就会有所帮助。

最后,但并非最不重要的是,这里是“收尾”大括号,与上面两行的“开头”大括号相匹配:

每个程序块都有这些开头/收尾大括号。编程中最常见的错误之一就是开头或收尾大括号太多。令人欣慰的是,大多数现代编辑器都有花哨的语法高亮功能,可以帮你匹配任何一对大括号(从而识别出任何没有搭档的大括号)。

1.2.3 编译代码

现在,我们终于可以让那些令人头疼的软件安装工作派上用场了。在“终端”选项卡中,运行以下命令:

如果一切顺利,你不会看到任何输出,只会看到一个新的命令提示符。如果出了问题,你会收到一条(或多条)错误信息,希望能指出需要修正的地方。当我们遇到更多示例时,我们会看到调试技巧,但现在,回看一下你的代码和上面的示例,看看能否发现任何不同之处。

如果你在处理第一个文件时仍遇到困难,请不要放弃!请查看附录A,从GitHub下载本书的示例代码。你可以按原样编译并运行代码,也可以以我们的示例为起点,进行自己的调整和修改。

1.2.4 运行代码

成功编译第一个C程序后,我们该如何测试它呢?如果列出目录中的文件,你会发现一个新文件,在Linux和macOS系统中名为 a.out ,在Windows系统中名为 a.exe 。要运行它,只需键入其名称即可。在许多Linux和macOS系统上,可执行路径可能不包括工作目录。在这种情况下,请使用本地路径前缀“./”(句点表示当前目录,斜线只是标准路径分隔符)。图1-13显示了输出结果。

图1-14显示了Windows上的输出结果。

图1-13:在macOS和Linux上打招呼

图1-14:在Windows上打招呼

在Windows上, .exe 后缀将文件标记为可执行文件。不过,运行程序时不需要包含后缀,只需键入 a 即可。根据所使用的命令提示符应用程序(例如,cmd或PowerShell),你可能还需要使用类似于macOS或Linux的本地目录前缀(.\)。

不过,作为一个名称,“a”非常乏味,而且肯定无法告诉我们程序的功能。如果你愿意,可以使用gcc命令的-o(输出)选项为你的程序指定一个更好的名字。

在Linux和macOS上:

在Windows上:

尝试执行该命令,然后查看文件夹中的文件。你应该可以运行一个新生成的 hello (或 hello.exe )文件。更好用。

发布代码

你已经编译好一个功能完备的C程序!如何让别人运行你的代码?很遗憾,这个问题很棘手。如果你想与在类似硬件上运行与你相同操作系统的人共享 a.out hello.exe 文件,你只需将程序复制到他们的机器上就可以了。但如果你在Windows操作系统上编译了 hello.exe ,却想与macOS用户共享,那你就不走运了。我们编译了一个本地应用程序。本地应用程序可以发挥硬件的最佳性能,但其代价是,你需要为你想支持的每个平台提供不同的编译版本(有时称为“二进制”)。

不过,你当然可以共享源代码。如果你将 hello.c 文件通过电子邮件从Windows发送到Linux,从macOS发送到Windows,或从Ubuntu发行版发送到Arch,收件人就可以建立自己的开发环境并编译你的代码。 QGgZRzVRPT3vc2tdJsJLyavRr7iuXDZAwN14WHicoDYV1Sdao6JkWHekMtu7qm/G

点击中间区域
呼出菜单
上一章
目录
下一章
×