版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第 2 章章文件分割和多文件编译文件分割和多文件编译2本章重点 q函数编写与函数参数的传递q多文件系统q多文件系统中使用makeq使用autotools32.1 函数函数q 函数指功能相对独立,由一系列语句组成的模块,它的目的有:q 当设计一个大型程序时,如果能够将这个程序依照功能,将其分割成较小的功能,然后依据这些小功能的要求编写函数,可以使程序简单化,同时也会使最后检查错误变得容易。1. 在一个程序中,会产生指令重复使用多次的问题,将这些重复使用的指令编写成一个函数,需要时加以调用,可以提高编程效率,也可以使程序精简。42.1.1 函数简介函数简介C语言函数可分为库函数和用户定义函数:q
2、 库函数:由C系统提供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。 1. 用户自定义函数:由用户按需要编写的函数。对于用户自定义函数, 不仅要在程序中定义函数本身, 在很多情况下还必须对该函数进行原型说明,然后才能使用。52.1.1 函数简介函数简介例例2-1:设计一个程序,要求在屏幕上打印输出五行“Linux程序设计,有点意思!”的字符串。q步骤步骤 1:编辑源程序代码;q步骤步骤 2:用gcc编译程序rootlocalhost root#gcc 2-1.c o 2-1q步骤步骤 3:运行程序运行程序rootlocalhost root
3、#./2-162.1.1 函数简介函数简介q 在c语言中,所有的函数定义都是平行的。即在一个函数的函数体内, 不能再定义另一个函数, 。但是函数之间允许相互调用,也允许嵌套调用。q 习惯上把调用者称为主调函数。 函数还可以自己调用自己,称为递归调用。q 函数的一般形式:函数类型 函数名(形参类型:形式参数1,形参类型:形式参数2,) 类型说明;语句;72.1.2 返回值返回值q函数调用时,主调函数把实参的值传送给被调函数的形参,从而实现主调函数向被调函数的数据传送。q函数调用中数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生
4、改变,并不会影响到实参。q函数运行结束,如果被调函数的结果需要传递回主调函数,通常用用return完成这项任务,叫函数的返回值。82.1.2 返回值返回值q例例2.2:设计一个程序,要求编写函数max,有两个参数,返回两个数中的最大值给主函数。 q步骤步骤 1:编辑源程序代码q步骤步骤 2:用gcc编译程序rootlocalhost root#gcc 2-2.c o 2-2q步骤步骤 3:运行程序rootlocalhost root#./2-2思考题:如果把此例中的数据传递改成指针传送,程序应思考题:如果把此例中的数据传递改成指针传送,程序应该如何设计?该如何设计?92.2 文件分割文件分割q
5、例例2.3:设计一个程序,要求计算输入的整数的平均值,并将此程序分割成多个小文件。q步骤步骤 1:编辑源程序代码102.2 文件分割文件分割q 步骤步骤 2:分析程序、分割文件将此程序分割成下列2个Linux c程序。(1)2-3-main.c为主程序:(2)2-3-avg.c为avg函数的定义:q步骤步骤 3:用gcc编译程序rootlocalhost root#gcc 2-3-main.c 2-3-avg.c o 2-3q步骤步骤 4:运行程序rootlocalhost root#./2-3112.2 文件分割文件分割qLinux c文件分割,主要是把每个自定义函数分割成独立的c源程序文件
6、,自定义函数的声明部分需要包含在主调函数中,这儿的主调函数是main。q如果自定义函数较多,也可以把函数声明都分割成独立的头文件,在主调函数中用#include包含分割出来的头文件。思考题:如何把自定义函数的声明部分,也分割成独立的思考题:如何把自定义函数的声明部分,也分割成独立的文件,分割后如何编译?文件,分割后如何编译?122.2 文件分割文件分割q 例例2.4:分割例2-2中的程序,要求分割后自定义函数在另一个独立的文件中。 q 步骤步骤 1:分析程序、分割文件q 例2-2程序有主函数main和自定义函数max,再把函数声明都分割成独立的头文件,可将此程序分割成下列3个文件。(1) 2-
7、4-main.c为主程序: (2) 2-4-max.c为max函数的定义 :(3) max.h为头文件,内含max函数的声明:132.2 文件分割文件分割q步骤步骤 2:用gcc编译程序rootlocalhost root#gcc 2-4-main.c 2-4-max.c o 2-4q步骤步骤 3:运行程序rootlocalhost root#./2-4思考题:能否将此例中的思考题:能否将此例中的#include max.h修改成修改成#include,为什么?,为什么?142.3 make工程管理器工程管理器qmake工程管理器是一个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳
8、自动发现更新过的文件而减少编译的工作量,同时,它通过读入makefile文件的内容来执行大量的编译工作。用户只需编写一次简单的编译语句就可以了。它大大的提高了实际的工作效率。152.3.1 编写编写makefile文件文件在一个Makefile文件中通常包含如下内容:q需要由make工具创建的目标体(target),通常是目标文件或可执行文件。q要创建的目标所依赖的文件。q创建每个目标体时需要运行的命令。162.3.1 编写编写makefile文件文件q例例2.5:设计一个程序,要求计算学生的总成绩和平均成绩,并用make工程管理器编译。 q步骤步骤 1:分析程序、分割文件q此程序有主函数ma
9、in和自定义函数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函数的定义 :172.3.1 编写编写makefile文件文件q步骤步骤 2:编辑makefile文件rootlocalhost root#vim makefile2-5 makefile内容:内容:q步骤步骤 3:用make命令编译程序rootlocalh
10、ost root#make f makefile2-5q步骤步骤 4: 用make命令再次编译q修改4个文件中的一个,重新用make编译,会发现只编译了2-5-main.c程序,另外的2个c源程序文件根本没有重新编译。q步骤步骤 5:运行程序rootlocalhost root#./2-5从结果来看,在没有使用从结果来看,在没有使用gcc编译器编译器命令情况下,依然把设计的程序编命令情况下,依然把设计的程序编译成了可执行文件,实现了设计的译成了可执行文件,实现了设计的功能,可见功能,可见make工程管理器调用了工程管理器调用了gcc编译器,编译器,makefile文件的编写是文件的编写是重点。
11、重点。182.3.2 makefile变量的使用变量的使用q例例2.6:设计一个程序,程序运行时从三道题目中随机抽取一道,题目存放在二维数组中。 q步骤步骤 1:分析程序、分割文件q此程序有主函数main和自定义函数fun_shuiji,可以分割成两个“.c”程序文件;再把函数声明和用到的库函数的头文件,分割到一个独立的自定义头文件“shuiji.h”;因此,可将此程序分割成3个文件。 (1)2-6-main.c为主程序 (2)shuiji.h为头文件 (3)2-6-fun_sum.c文件192.3.2 makefile变量的使用变量的使用q步骤步骤 2:编辑makefile文件rootloc
12、alhost root#vim makefile2.6q一般的一般的makefile写法:写法:q使用变量的makefile写法如下: q步骤步骤 3:用make命令编译程序rootlocalhost root#make f makefile2-6 q步骤步骤 4:运行程序rootlocalhost root#./2-6202.3.2 makefile变量的使用变量的使用qMakefile中常见预定义变量212.3.2 makefile变量的使用变量的使用qMakefile 中常见自动变量思考题:如果此例的题目数、题目内容以及随机抽取的思考题:如果此例的题目数、题目内容以及随机抽取的题目量,都
13、由用户决定,应该如何修改程序?题目量,都由用户决定,应该如何修改程序?makefile文件要不要修改?文件要不要修改?222.3.3 make和和makefileq makefile文件主要包含了5部分内容:q 显式规则。说明了如何生成一个或多个目标文件。由makefile文件的创作者指出,包括要生成的文件、文件的依赖文件、生成的命令。q 隐式规则。由于make有自动推导的功能,所以隐式的规则可以比较粗糙地简略书写makefile文件,这是由make所支持的。1. 变量定义。在makefile文件中要定义一系列的变量,变量一般都是字符串,这与C语言中的宏有些类似。当makefile文件执行时,
14、其中的变量都会扩展到相应的引用位置上。232.3.3 make和和makefileq 文件指示。其包括3个部分,一个是在一个makefile文件中引用另一个makefile文件;另一个是指根据某些情况指定makefile文件中的有效部分;还有就是定义一个多行的命令。q 注释。makefile文件中只有行注释,其注释用“#”字符。如果要在makefile文件中使用“#”字符,可以用反斜框进行转义,如:“#”。 242.3.3 make和和makefileGNU的make工作时的执行步骤: q 读入所有的makefile文件。q 读入被include包括的其他makefile文件。q 初始化文件中
15、的变量。q 推导隐式规则,并分析所有规则。q 为所有的目标文件创建依赖关系链。q 根据依赖关系,决定哪些目标要重新生成。q 执行生成命令。252.4 autotools的使用的使用q autotools工具只需用户输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成makefile了。q 可以完成系统配置信息的收集,从而可以方便地处理各种移植性的问题。q autotools是系列工具,包含有:q aclocalq autoscanq autoconfq autoheader1. automake262.4 autotools的使用的使用q用autotools产生Makefile文件的总体流
16、程 272.4 autotools的使用的使用q利用autotools系列工具生成“Makefile”文件的基本步骤 :282.4 autotools的使用的使用q例例2.7:利用例2.3中的两个程序文件“2-3-main.c”和“2-3-avg.c”,把它们的文件名分别改成“2.7.main.c”和“2.7.avg.c”,用autotools工具生成makefile文件。 q步骤步骤 1: 使用autoscan。292.4 autotools的使用的使用q步骤步骤 2: 修改“configure.scan”文件,重命名成“configure.in”文件q修改时需要增加一个宏AM_INIT_A
17、UTOMAKE(PACKAGE,VERSION),还要把AC_CONFIG_HEADER更改为AM_CONFIG_HEADER。q修改后,用mv命令重命名:rootlocalhost root#mv configure.scan configure.inq步骤步骤 3: 使用aclocal、autoconf和autoheaderq步骤步骤 4:使用automake automake需要的脚本配置文件是“Makefile.am”,这个文件需要自己建立。rootlocalhost root#vim Makefile.am特别说明:q AUTOMAKE_OPTIONS为设置automake的选项。a
18、utomake提供了3种软件等级:foreign、gnu、gnits,让用户选择使用,默认等级是gnu。现在使用的foreign只是检测必要的文件。qbin_PROGRAMS定义了要产生的执行文件名。如果产生多个可执行文件,每个文件名用空格隔开。qfile_SOURCES定义file这个执行程序的依赖文件。同样的,对于多个执行文件,那就要定义相应的file_SOURCES。AUTOMAKE_OPTIONS=foreignbin_PROGRAMS=testtest_SOURCES=2.7.main.c 2.7.avg.c302.4 autotools的使用的使用q步骤步骤 5:运行configureq步骤步骤 6: 将程序打包发布rootlocalhost automake# make distrootlocalhost automake# ls312.4 autotools的使用的使用q autotools生成的makefile是最常见的开源软件提供的方式,安装此类开源软件的一般步骤:q 解压:tar test-1.0-tar.gz q 输入“./configure”,执
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西南医科大学《微机原理及接口》2023-2024学年第一学期期末试卷
- 西南交通大学《计算机辅助设计》2019-2020学年第一学期期末试卷
- 西京学院《景观小品设计》2021-2022学年第一学期期末试卷
- 西京学院《插画设计》2023-2024学年第一学期期末试卷
- 西华大学《计算机组成原理》2022-2023学年第一学期期末试卷
- 西北大学《物理讲坛》2021-2022学年第一学期期末试卷
- 精细化工发展潜力分析
- 数字电压表的课程设计
- 中国生活用纸行业投资前景分析及未来发展趋势研究报告(智研咨询发布)
- 《农药基础知识》课件
- 各地最 新作文展播40之13 话题:“超越他人与超越自我”( 高三第二次联合测评)
- 2024年度货物运输安全管理协议范例版B版
- 肝硬化腹水的治疗原则
- 高压输电线路质量、检查、验收培训课件
- 《电焊工培训基础》课件
- 住宅小区乔木修剪方案
- 《渔家傲(天接云涛连晓雾)》《如梦令(常记溪亭日暮)》课件-2024-2025学年统编版语文八年级上册
- 绿色货运代理的发展趋势
- 2024公共数据授权运营实施方案
- 天津市部分区2024-2025学年九年级上学期11月期中数学试题
- 开分店合同(2篇)
评论
0/150
提交评论