《linux软件工程师(c语言)实用教程》第2

上传人:kms****20 文档编号:51024332 上传时间:2018-08-12 格式:PPT 页数:32 大小:513.50KB
返回 下载 相关 举报
《linux软件工程师(c语言)实用教程》第2_第1页
第1页 / 共32页
《linux软件工程师(c语言)实用教程》第2_第2页
第2页 / 共32页
《linux软件工程师(c语言)实用教程》第2_第3页
第3页 / 共32页
《linux软件工程师(c语言)实用教程》第2_第4页
第4页 / 共32页
《linux软件工程师(c语言)实用教程》第2_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《《linux软件工程师(c语言)实用教程》第2》由会员分享,可在线阅读,更多相关《《linux软件工程师(c语言)实用教程》第2(32页珍藏版)》请在金锄头文库上搜索。

1、第 2 章文件分割和多文件编译本章重点 函数编写与函数参数的传递 多文件系统 多文件系统中使用make 使用autotools2.1 函数 函数指功能相对独立,由一系列语句组成的模块 ,它的目的有: 当设计一个大型程序时,如果能够将这个程序依 照功能,将其分割成较小的功能,然后依据这些 小功能的要求编写函数,可以使程序简单化,同 时也会使最后检查错误变得容易。 在一个程序中,会产生指令重复使用多次的问题 ,将这些重复使用的指令编写成一个函数,需要 时加以调用,可以提高编程效率,也可以使程序 精简。2.1.1 函数简介C语言函数可分为库函数和用户定义函数: 库函数:由C系统提供,用户无须定义,也

2、不 必在程序中作类型说明,只需在程序前包含有 该函数原型的头文件即可在程序中直接调用。 用户自定义函数:由用户按需要编写的函数。 对于用户自定义函数, 不仅要在程序中定义函 数本身, 在很多情况下还必须对该函数进行原 型说明,然后才能使用。2.1.1 函数简介例2-1:设计一个程序,要求在屏幕上打印输出五 行“Linux程序设计,有点意思!”的字符串。 步骤 1:编辑源程序代码;步骤 2:用gcc编译程序 rootlocalhost root#gcc 2-1.c o 2-1 步骤 3:运行程序 rootlocalhost root#./2-12.1.1 函数简介 在c语言中,所有的函数定义都是

3、平行的。即在一个函数 的函数体内, 不能再定义另一个函数, 。但是函数之 间允许相互调用,也允许嵌套调用。 习惯上把调用者称为主调函数。 函数还可以自己调用自 己,称为递归调用。 函数的一般形式: 函数类型 函数名(形参类型:形式参数1,形参类型:形式参数2 ,) 类型说明; 语句; 2.1.2 返回值函数调用时,主调函数把实参的值传送给被调函 数的形参,从而实现主调函数向被调函数的数据 传送。 函数调用中数据传送是单向的。 即只能把实参 的值传送给形参,而不能把形参的值反向地传送 给实参。 因此在函数调用过程中,形参的值发 生改变,并不会影响到实参。 函数运行结束,如果被调函数的结果需要传递

4、回 主调函数,通常用用return完成这项任务,叫函 数的返回值。2.1.2 返回值例2.2:设计一个程序,要求编写函数max,有 两个参数,返回两个数中的最大值给主函数。 步骤 1:编辑源程序代码步骤 2:用gcc编译程序 rootlocalhost root#gcc 2-2.c o 2-2 步骤 3:运行程序 rootlocalhost root#./2-2思考题:如果把此例中的数据传递改成指针传送,程序应 该如何设计?2.2 文件分割例2.3:设计一个程序,要求计算输入的整数的 平均值,并将此程序分割成多个小文件。 步骤 1:编辑源程序代码2.2 文件分割 步骤 2:分析程序、分割文件

5、将此程序分割成下列2个Linux c程序。 (1)2-3-main.c为主程序:(2)2-3-avg.c为avg函数的定义:步骤 3:用gcc编译程序rootlocalhost root#gcc 2-3-main.c 2-3-avg.c o 2-3 步骤 4:运行程序 rootlocalhost root#./2-32.2 文件分割Linux c文件分割,主要是把每个自定义函数分 割成独立的c源程序文件,自定义函数的声明部 分需要包含在主调函数中,这儿的主调函数是 main。如果自定义函数较多,也可以把函数声明都分割 成独立的头文件,在主调函数中用#include包含 分割出来的头文件。思考题

6、:如何把自定义函数的声明部分,也分割成独立的 文件,分割后如何编译?2.2 文件分割 例2.4:分割例2-2中的程序,要求分割后自定 义函数在另一个独立的文件中。 步骤 1:分析程序、分割文件 例2-2程序有主函数main和自定义函数max,再把函 数声明都分割成独立的头文件,可将此程序分割成 下列3个文件。 (1) 2-4-main.c为主程序: (2) 2-4-max.c为max函数的定义 :(3) max.h为头文件,内含max函数的声明:2.2 文件分割步骤 2:用gcc编译程序rootlocalhost root#gcc 2-4-main.c 2-4-max.c o 2-4 步骤 3

7、:运行程序 rootlocalhost root#./2-4思考题:能否将此例中的#include “max.h“修改成 #include,为什么?2.3 make工程管理器make工程管理器是一个“自动编译管理器”,这 里的“自动”是指它能够根据文件时间戳自动发现 更新过的文件而减少编译的工作量,同时,它通 过读入makefile文件的内容来执行大量的编译工 作。用户只需编写一次简单的编译语句就可以了 。它大大的提高了实际的工作效率。2.3.1 编写makefile文件在一个Makefile文件中通常包含如下内容: 需要由make工具创建的目标体(target),通 常是目标文件或可执行文件

8、。 要创建的目标所依赖的文件。 创建每个目标体时需要运行的命令。2.3.1 编写makefile文件例2.5:设计一个程序,要求计算学生的总成绩 和平均成绩,并用make工程管理器编译。 步骤 1:分析程序、分割文件 此程序有主函数main和自定义函数fun_sum和 fun_avg,再把函数声明都分割成独立的头文件,可 将此程序分割成下列4个文件。 (1)2-5-main.c为主程序 :(2)chengji.h为头文件,内含fun_avg和fun_sum函数的声明 :(3)2-5-fun_sum.c为fun_sum函数的定义:(4)2-5-fun_avg.c为fun_avg函数的定义 :2.

9、3.1 编写makefile文件步骤 2:编辑makefile文件 rootlocalhost root#vim makefile2-5 makefile内容: 步骤 3:用make命令编译程序 rootlocalhost root#make f makefile2-5步骤 4: 用make命令再次编译 修改4个文件中的一个,重新用make编译,会发现只 编译了2-5-main.c程序,另外的2个c源程序文件根本 没有重新编译。步骤 5:运行程序 rootlocalhost root#./2-5从结果来看,在没有使用gcc编译器 命令情况下,依然把设计的程序编 译成了可执行文件,实现了设计的

10、功能,可见make工程管理器调用了 gcc编译器,makefile文件的编写是 重点。2.3.2 makefile变量的使用例2.6:设计一个程序,程序运行时从三道题目中 随机抽取一道,题目存放在二维数组中。 步骤 1:分析程序、分割文件 此程序有主函数main和自定义函数fun_shuiji,可以分割 成两个“.c”程序文件;再把函数声明和用到的库函数的头 文件,分割到一个独立的自定义头文件“shuiji.h”;因此 ,可将此程序分割成3个文件。(1)2-6-main.c为主程序 (2)shuiji.h为头文件(3)2-6-fun_sum.c文件2.3.2 makefile变量的使用步骤 2

11、:编辑makefile文件 rootlocalhost root#vim makefile2.6 一般的makefile写法:使用变量的makefile写法如下: 步骤 3:用make命令编译程序rootlocalhost root#make f makefile2-6 步骤 4:运行程序 rootlocalhost root#./2-62.3.2 makefile变量的使用Makefile中常见预定义变量2.3.2 makefile变量的使用Makefile 中常见自动变量思考题:如果此例的题目数、题目内容以及随机抽取的 题目量,都由用户决定,应该如何修改程序?makefile 文件要不要修

12、改?2.3.3 make和makefile makefile文件主要包含了5部分内容:显式规则。说明了如何生成一个或多个目标文 件。由makefile文件的创作者指出,包括要生成 的文件、文件的依赖文件、生成的命令。 隐式规则。由于make有自动推导的功能,所以 隐式的规则可以比较粗糙地简略书写makefile文 件,这是由make所支持的。 变量定义。在makefile文件中要定义一系列的变 量,变量一般都是字符串,这与C语言中的宏有 些类似。当makefile文件执行时,其中的变量都 会扩展到相应的引用位置上。2.3.3 make和makefile文件指示。其包括3个部分,一个是在一个 m

13、akefile文件中引用另一个makefile文件;另一 个是指根据某些情况指定makefile文件中的有 效部分;还有就是定义一个多行的命令。 注释。makefile文件中只有行注释,其注释用 “#”字符。如果要在makefile文件中使用“#”字符 ,可以用反斜框进行转义,如:“#”。 2.3.3 make和makefileGNU的make工作时的执行步骤: 读入所有的makefile文件。 读入被include包括的其他makefile文件。 初始化文件中的变量。 推导隐式规则,并分析所有规则。 为所有的目标文件创建依赖关系链。 根据依赖关系,决定哪些目标要重新生成。 执行生成命令。2.

14、4 autotools的使用 autotools工具只需用户输入简单的目标文 件、依赖文件、文件目录等就可以轻松地 生成makefile了。 可以完成系统配置信息的收集,从而可以 方便地处理各种移植性的问题。 autotools是系列工具,包含有: aclocal autoscan autoconf autoheader automake2.4 autotools的使用用autotools产生Makefile文件的总体流程 2.4 autotools的使用利用autotools系列工具生成“Makefile”文件的基 本步骤 :2.4 autotools的使用例2.7:利用例2.3中的两个程序

15、文件“2-3- main.c”和“2-3-avg.c”,把它们的文件名分别改 成“2.7.main.c”和“2.7.avg.c”,用autotools工具 生成makefile文件。 步骤 1: 使用autoscan。2.4 autotools的使用步骤 2: 修改“configure.scan”文件,重命名成 “configure.in”文件修改时需要增加一个宏 AM_INIT_AUTOMAKE(PACKAGE,VERSION),还 要把AC_CONFIG_HEADER更改为 AM_CONFIG_HEADER。 修改后,用mv命令重命名: rootlocalhost root#mv conf

16、igure.scan configure.in 步骤 3: 使用aclocal、autoconf和autoheader步骤 4:使用automakeautomake需要的脚本配置文件是“Makefile.am”,这个文件 需要自己建立。 rootlocalhost root#vim Makefile.am特别说明: AUTOMAKE_OPTIONS为设置automake的选项。 automake提供了3种软件等级:foreign、gnu、gnits,让用 户选择使用,默认等级是gnu。现在使用的foreign只是检测 必要的文件。 bin_PROGRAMS定义了要产生的执行文件名。如果产生多 个可执行文件,每个文件

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号