《C语言程序设计进阶教程》一1.1 编译-阿里云开发者社区

开发者社区> 华章计算机> 正文

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

简介: 本文讲的是C语言程序设计进阶教程一1.1 编译,本节书摘来华章计算机《C语言程序设计进阶教程》一书中的第1章,第1.1节, Intermediate C Programming[美] 陆永祥(Yung-Hsiang Lu) 著 徐东 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
+关注继续查看

第1章

程序的执行

1.1 编译

本文讲的是C语言程序设计进阶教程一1.1 编译,本章讲述怎样在Linux下编写、编译和执行程序。我们使用Linux终端并解释你需要键入的命令。为什么要学习怎样使用终端呢?首先,此终端对于使用计算机工作而言是一个灵活且方便的界面。意识到这一点可能需要一些经验的积累,但是学习怎样使用此终端将会提高你的生产力。其次,许多云计算或者Web服务提供终端访问。这是提供计算资源的一个很自然的方法,尤其是当涉及在多台计算机上工作的时候(像在数据中心一样)。当仅在一台计算机上工作的时候,图形用户界面(GUI)十分优秀。然而当面对多台计算机的时候,GUI就可能造成困扰。同时,使用终端可以帮助你理解UNIX系统是如何工作的。在熟悉了终端指令之后,你将会理解集成开发环境(IDE)和它可以为你做些什么。Eclipse IDE将会在本书后续的章节中介绍。
在Linux下启动终端并输入:
screenshot
本书中,$被用作终端提示符。
第一条命令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”。这是刚刚创建的目录。
在终端中输入:
screenshot
如果在终端上没有显示或者出现“Command not found”,那么请先安装Emacs。如果你不知道怎样在Linux下安装软件,请阅读附录A.5部分。
在终端中输入:
screenshot
这条命令会启动Emacs去编辑一个叫作progl.c的文件。添加&允许你同时使用终端和Emacs编辑器。如果结尾处没有&,终端将强制等待直到Emacs退出。在Emacs中输入如下代码:
screenshot
保存文件。你可能猜到了此程序将显示:
screenshot
这是本书中出现的第一个完整的程序,需要做一些说明。此程序通过调用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中一种很受欢迎的编译器。在终端中,输入:
screenshot
这条指令有如下含义:
执行安装在Linux下的gcc指令。
使用prog1.c作为gcc指令的输入。
把输出文件命名为prog(-o指定输出文件的名字)。此输出文件是一个可执行文件,意思是计算机可以运行它。
别这样输入:
screenshot
这条指令将擦除文件prog1.c。
gcc编译器拥有很多选项。请阅读相关文档来了解更多内容。要找到此文档,在搜索引擎上输入“linux gcc”,将会看到如下显示:
screenshot
这个文档也叫“手册页”(man page),在这里“man”的意思是“manual”。这些手册页通常编写得很好却很简洁。早期计算机很昂贵,因此设计师们试图让一切越短越好。我们已经看到了一些Linux指令:
screenshotcd: change directory(更改目录)。
screenshotgcc: convert a human-readable file to a computer-readable file(把人类可读文件转化为计算机可读文件)。
screenshotman: display a manual page(显示手册页)。
screenshotmkdir: make a new directory(创建一个新目录)。
gcc指令的输出是一个可执行文件。在Linux下,可以通过使用file指令来寻找一个文件的信息。请在终端中输入:
screenshot
输出应该和下面的类似,但是细节会根据程序在不同计算机上编译而变化:
screenshot
最值得关注的是单词“executable”(可执行文件)。这个词意味着“prog”这个文件是一个程序。一般来说,Linux下的可执行文件没有扩展名,不像在Windows下使用的“.exe”。你要怎样去执行此程序呢?输入如下指令:
screenshot
这里,prog是这个程序的名字;./ 的意思是当前的目录。为什么需要在程序前面加上./呢?因为在不同目录下可能存在相同名字的文件。通过添加./,终端会知道你想要的程序在此目录下。一些人喜欢给他们的程序命名为“test”。对于程序而言这是一个不好的名字,因为“test”也是Linux下内置的一条指令。如果你输入:
screenshot
那么那条Linux指令就会运行。如果你输入:
screenshot
那么在此目录下的程序就会运行。
argc到底是什么呢?它存储着赋给程序的实参的数量。我们通过运行几次此程序来解释吧。
screenshot
你注意到argc的变化了吗?当程序直接被执行且没有其他内容附在后面时,argc为1。如果在程序后面加上一些词,那么argc就会变大。加的词(也就是实参)越多,argc就变得越大。这说明当程序在运行的时候实参可以加上去。连续的多个实参通过一个或多个空格分隔开。终端会分辨出你的程序(特指main函数)实参的数目。正如下面的例子显示的一样,在词之间添加额外的空格不会有什么不同。一个空格和多个空格作用同样。
screenshot
程序本身总是第一个实参。因为你必须输入程序的名字来运行此程序,所以argc的值总是至少为1。当使用gcc指令时argc的值是多少呢?
screenshot
答案是4。
screenshot
screenshot

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《例说8051:单片机程序设计案例教程》——导读
从8048开始,“单片机”即成为广受欢迎的代名词,8051更成为电机、电子类专业必修的课程。当然,应用单片机制作电子系统项目,既简单又经济实惠,早已成为学生的最爱。在电路设计方面,需求量较大、电路较复杂的系统可采用为客户专用而设计的IC(即ASIC),如芯片组、控制芯片等,虽然ASIC的单位成本不高,但总体成本很高、开发时间也比较长。
834 0
你学不懂C语言,是因为不懂编写C程序的7个步骤
你学不懂C语言,是因为不懂编写C程序的7个步骤
1638 0
C/C++程序编译流程(预处理->编译->汇编->链接)
程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。
741 0
教你用C语言编写万年历,程序员超乎你的想象!
教你用C语言编写万年历,程序员超乎你的想象!
1394 0
Rust语言教程(1) - 一门没有GC的语言
Rust语言是一门没有GC的语言,那么,它是如何管理内存的呢?
3578 0
《C语言程序设计进阶教程》一1.2 重定向输出
本文讲的是C语言程序设计进阶教程一1.2 重定向输出,本节书摘来华章计算机《C语言程序设计进阶教程》一书中的第1章,第1.1节, Intermediate C Programming[美] 陆永祥(Yung-Hsiang Lu) 著 徐东 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
922 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载