《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 编译

相关文章
|
3月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
3月前
|
自然语言处理 编译器 Linux
【C语言篇】编译和链接以及预处理介绍(上篇)1
【C语言篇】编译和链接以及预处理介绍(上篇)
46 1
|
5月前
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
158 1
|
1月前
|
存储 自然语言处理 Unix
【C语言】C语言 4 个编译过程详解
编译是将源代码转换为目标代码的过程。它是在编译器的帮助下完成的。编译器检查源代码是否存在语法或结构错误,如果源代码没有错误,则生成目标代码。
54 1
|
3月前
|
存储 自然语言处理 编译器
|
3月前
|
编译器 Linux C语言
【C语言篇】编译和链接以及预处理介绍(下篇)
【C语言篇】编译和链接以及预处理介绍(下篇)
38 1
【C语言篇】编译和链接以及预处理介绍(下篇)
|
3月前
|
自然语言处理 编译器 Linux
C语言中抽象的编译和链接原理
C语言中抽象的编译和链接原理
32 1
|
3月前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
3月前
|
编译器 C语言 C++
VSCode安装配置C语言(保姆级教程)
VSCode安装配置C语言(保姆级教程)
|
4月前
|
C语言
C语言程序设计核心详解 第四章&&第五章 选择结构程序设计&&循环结构程序设计
本章节介绍了C语言中的选择结构,包括关系表达式、逻辑表达式及其运算符的优先级,并通过示例详细解释了 `if` 语句的不同形式和 `switch` 语句的使用方法。此外,还概述了循环结构,包括 `while`、`do-while` 和 `for` 循环,并解释了 `break` 和 `continue` 控制语句的功能。最后,提供了两道例题以加深理解。
111 7