《C语言程序设计进阶教程》一1.1 编译

第1章

程序的执行

1.1 编译

本文讲的是C语言程序设计进阶教程一1.1 编译,本章讲述怎样在Linux下编写、编译和执行程序。我们使用Linux终端并解释你需要键入的命令。为什么要学习怎样使用终端呢?首先,此终端对于使用计算机工作而言是一个灵活且方便的界面。意识到这一点可能需要一些经验的积累,但是学习怎样使用此终端将会提高你的生产力。其次,许多云计算或者Web服务提供终端访问。这是提供计算资源的一个很自然的方法,尤其是当涉及在多台计算机上工作的时候(像在数据中心一样)。当仅在一台计算机上工作的时候,图形用户界面(GUI)十分优秀。然而当面对多台计算机的时候,GUI就可能造成困扰。同时,使用终端可以帮助你理解UNIX系统是如何工作的。在熟悉了终端指令之后,你将会理解集成开发环境(IDE)和它可以为你做些什么。Eclipse IDE将会在本书后续的章节中介绍。
在Linux下启动终端并输入:
《C语言程序设计进阶教程》一1.1 编译
本书中,$被用作终端提示符。
第一条命令cd的意思是“change directory”。如果像第一条命令中那样在cd后面没有添加参数,那么它将返回至你的主目录(也叫“文件夹”)。
第二条命令pwd的意思是“print the current working directory”。它类似于/home/yourname/。
第三条命令mkdir的意思是“make a directory”。命令mkdir cprogram的意思是“make a directory whose name is cprogram”。
不能创建名字里包含空格的目录或文件。原因很简单:关于目录和文件名的国际标准(称为国际标准化组织或ISO 9660)不允许出现空格。如果一个目录或者文件名中含有空格,那么一些程序将无法运行。
最后一条命令cd cprogram的意思是“change directory to (i.e.,enter) cprogram”。这是刚刚创建的目录。
在终端中输入:
《C语言程序设计进阶教程》一1.1 编译
如果在终端上没有显示或者出现“Command not found”,那么请先安装Emacs。如果你不知道怎样在Linux下安装软件,请阅读附录A.5部分。
在终端中输入:
《C语言程序设计进阶教程》一1.1 编译
这条命令会启动Emacs去编辑一个叫作progl.c的文件。添加&允许你同时使用终端和Emacs编辑器。如果结尾处没有&,终端将强制等待直到Emacs退出。在Emacs中输入如下代码:
《C语言程序设计进阶教程》一1.1 编译
保存文件。你可能猜到了此程序将显示:
《C语言程序设计进阶教程》一1.1 编译
这是本书中出现的第一个完整的程序,需要做一些说明。此程序通过调用printf来打印信息。printf是C语言提供的一个函数,但是你需要在使用此函数之前把stdio.h包含进来,stdio.h是标准化输入输出函数的一个头文件。在一个C程序中,起始点是main函数。这个程序在它成功打印地址后将返回EXIT_SUCCESS。你能够猜到,如果一个程序能够返回EXIT_SUCCESS,那么另一个程序便可以返回EXIT_FAILURE。为什么程序要返回EXIT_SUCCESS或是EXIT_FAILURE呢?在今天这样复杂的电脑系统中,许多程序是被其他电脑程序调用的。因此,让你的程序告诉调用程序其是否完成了设定去做的任务是十分重要的。此信息允许调用程序去决定下一步采取什么行动。EXIT_SUCCESS和EXIT_FAILURE是在stdlib.h中定义的,所以在第2行中将它包含进来。
本书中,源代码用从1开始的行编号标示出来。有时,代码会涉及前面提到的例子,行编号和前例中的值一致。
main函数是一个C程序的起始点,但是这并不总是适用于C++程序。如果一个C++程序有一个静态对象,那么此对象的构造函数将会在main函数之前被调用。因为本书是关于C编程的,那么假定main函数是所有程序的起始点是保险的。
argc是什么?通过运行程序更容易来回答这个问题。首先,我们需要解释如何把这个程序从人类可读的格式转换为计算机可读的格式。
输入进Emacs的是一个“C源文件”。它大致和英语类似,并由拉丁字母构成。然而,因为计算机不理解这种格式,“源文件”需要转换为一种叫作可执行文件的计算机可读格式。编译器是这种转换的必需工具,gcc则是Linux中一种很受欢迎的编译器。在终端中,输入:
《C语言程序设计进阶教程》一1.1 编译
这条指令有如下含义:
执行安装在Linux下的gcc指令。
使用prog1.c作为gcc指令的输入。
把输出文件命名为prog(-o指定输出文件的名字)。此输出文件是一个可执行文件,意思是计算机可以运行它。
别这样输入:
《C语言程序设计进阶教程》一1.1 编译
这条指令将擦除文件prog1.c。
gcc编译器拥有很多选项。请阅读相关文档来了解更多内容。要找到此文档,在搜索引擎上输入“linux gcc”,将会看到如下显示:
《C语言程序设计进阶教程》一1.1 编译
这个文档也叫“手册页”(man page),在这里“man”的意思是“manual”。这些手册页通常编写得很好却很简洁。早期计算机很昂贵,因此设计师们试图让一切越短越好。我们已经看到了一些Linux指令:
《C语言程序设计进阶教程》一1.1 编译cd: change directory(更改目录)。
《C语言程序设计进阶教程》一1.1 编译gcc: convert a human-readable file to a computer-readable file(把人类可读文件转化为计算机可读文件)。
《C语言程序设计进阶教程》一1.1 编译man: display a manual page(显示手册页)。
《C语言程序设计进阶教程》一1.1 编译mkdir: make a new directory(创建一个新目录)。
gcc指令的输出是一个可执行文件。在Linux下,可以通过使用file指令来寻找一个文件的信息。请在终端中输入:
《C语言程序设计进阶教程》一1.1 编译
输出应该和下面的类似,但是细节会根据程序在不同计算机上编译而变化:
《C语言程序设计进阶教程》一1.1 编译
最值得关注的是单词“executable”(可执行文件)。这个词意味着“prog”这个文件是一个程序。一般来说,Linux下的可执行文件没有扩展名,不像在Windows下使用的“.exe”。你要怎样去执行此程序呢?输入如下指令:
《C语言程序设计进阶教程》一1.1 编译
这里,prog是这个程序的名字;./ 的意思是当前的目录。为什么需要在程序前面加上./呢?因为在不同目录下可能存在相同名字的文件。通过添加./,终端会知道你想要的程序在此目录下。一些人喜欢给他们的程序命名为“test”。对于程序而言这是一个不好的名字,因为“test”也是Linux下内置的一条指令。如果你输入:
《C语言程序设计进阶教程》一1.1 编译
那么那条Linux指令就会运行。如果你输入:
《C语言程序设计进阶教程》一1.1 编译
那么在此目录下的程序就会运行。
argc到底是什么呢?它存储着赋给程序的实参的数量。我们通过运行几次此程序来解释吧。
《C语言程序设计进阶教程》一1.1 编译
你注意到argc的变化了吗?当程序直接被执行且没有其他内容附在后面时,argc为1。如果在程序后面加上一些词,那么argc就会变大。加的词(也就是实参)越多,argc就变得越大。这说明当程序在运行的时候实参可以加上去。连续的多个实参通过一个或多个空格分隔开。终端会分辨出你的程序(特指main函数)实参的数目。正如下面的例子显示的一样,在词之间添加额外的空格不会有什么不同。一个空格和多个空格作用同样。
《C语言程序设计进阶教程》一1.1 编译
程序本身总是第一个实参。因为你必须输入程序的名字来运行此程序,所以argc的值总是至少为1。当使用gcc指令时argc的值是多少呢?
《C语言程序设计进阶教程》一1.1 编译
答案是4。
《C语言程序设计进阶教程》一1.1 编译
《C语言程序设计进阶教程》一1.1 编译

那些实参本身是字符串,储存在argc中。在第6章解释字符串时会涉及这些。

原文标题:C语言程序设计进阶教程一1.1 编译

上一篇:Flex(flash)检测摄像头的3种状态(是否被占用,没安装摄像头,正常)


下一篇:从零开始搭二维激光SLAM --- 基于ceres的后端优化的代码实现