c语言程序设计现代方法15-编写大型程序._第1页
c语言程序设计现代方法15-编写大型程序._第2页
c语言程序设计现代方法15-编写大型程序._第3页
c语言程序设计现代方法15-编写大型程序._第4页
c语言程序设计现代方法15-编写大型程序._第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第15章编写大型程序PROGRAIVIMINGA Modern Approach mcoo mr.onAl r*h 2008 W W. Norton & Company. All rights reserved源文件将一个程序分为多个源文件有重大好处:把相关的函数和变暈放入一个文件中冇助丁澄清程 序的结构.-每个源文件对以单独编译,节省时间.-曲数能够更容易地川r工他程序中.PROGRAMMINGA Modern Apprxxtc/i mcco *Copyright (B 2008 W W. Norton & Company.All rights reserved8莎15 E :编吗大住和头文

2、件当一个程序分为儿个源文件时,会有如下问题:-一个文件中的函数怎样调用在另一个文件屮定义的 函数?-凶数怎样访问其他文件中的外部变最?-两个文件怎样共亨相同的宏定义和类型定义?答案在于#include,它使多个文件共享信息 成为可能.f PROGRAIVIIVIING9A Modern Apprwic/i 巴* msA诂怡 reserved.莎75斎:编弓大住用字头文件 #include告诉预处理器把指定的文件内容插 入进来.多个文件需要共享的信息可以放入这样一个文 件中.然JuR#include就可以把这个文件的内容包 含到每一个源文件中.这样被包含进来的文件就叫头文件(有时也叫 包含文件)

3、.依照惯例,头文件具有h扩展名.PROGRAMMINGA Modern AppttmcJi、心mCopynght 2008 W W. Norton & Company.All rights reserved.10v; 15 士爲打大住朴#include #include有两种匸要形式.种用于C库中的头文件:#include 另一种用于所令的其他头文件:#include filename”两者的不同之处在于编译器如何确定头文件的 位置.f PROGRAMMINGA Modem Approach tcoo a3旳s reserved.仍75氏缩弓大空程宇#include定位头文件的典型规则:-#i

4、nclude :查找系统头文件所在的路径.-#include filename:令:找为前路径,然肩資找系 统头文件所在的路径.查找头文件的位置可以改变,通常通过命令行 选项,例如-Tpath.PROGRAMMINGA Modef Apprwtch如Copynght 2008 W W. Norton & Company.All rights reserved.12第15老:编吗大空和庁#include不要用尖括号包含你写的文件:#include /* WRONG * */预处理器可能会在系统头文件所在的地方寻找myheader hf PROGRAMMING13A Moder* Appmich

5、巴z mgA材恰 reserved.莎15老:編弓大住用庁#include # include指示中的文件名可以包含盘符和路 径:#include nc:cprogsutilsh/* Windows path */#include n/cprogs/utilshn/* UNIX path */虽然ttinclude中的引号使文件名看起来像字 符串,但是预处理器不会那样处理.PROGRAMMINGA Modern Approach hccd Copynght 2008 W W. Norton & Company.All rights reserved.14#include通常最好不要在# inc

6、lude包含盘符或路径. Windows上 #include的坏例 了:#include#include #include好版木:#includels.hn#include nincludeutils hffr,d: utils hn r,cprogsincludeutils .hlr nd: cprogsincludeutiIs htrPROGRAMMINGA Modern Apprxmcfi mcco :计Copynght O 2008 W W. Norton & Company.All rights reserved.16C PROGRAMMINGA Modern Apptgch kc

7、m - n15Copyright 02008 W. W. Norton & CompMy.All rights reserved弟、5章:编雪大申程宇#include ftinclude还有第三种形式:#include tokenstokens是任意的预处理符号序列.预处理器将扫描符号并用找到的宏替换它.右二宏替换Z后的#include必须满足合法形式.第三种#include形式的好处是文件名可以用 宏定义,而不必硬编码.#include例:#if defined(IA32)#define CPU_FILE nia32h”#elif defined7lA64)define CPU_FILE n

8、ia64 h”#elif defined(AI4D64 )#define CPU_FILE ”amd64h” #endif#include CPU_FILEt PROGRAM Ml NG17A Modern Approach ,g。 心A材怡 reserved.好!5草:編弓大黎程庁共亨宏眾义和类型疋义大多数大型程序拥有多个源文件共享的宏定义 和类型定义.这些定义应该放入头文件中.PROGRAMMINGA ModcrN Approach mcco Copyright 2008 W W. Norton & Company.All rights reserved1815直:編弓大申和宇共宁宏眾义和

9、类型定义 设程序使用宏BOOL, TRUE,和FALSE.它们的定义可以放入一个头文件booleanh 中:#define BOOL int#define TRUE 1#define FALSE 0任何需要这些宏的源文件町以简单地使用#include boolean .hffC PROGRAIVIIVIING19A 伽d和 Appnch stco.0 u.r.oNAll riflhls reserved.第=5草:编弓大牛J程宇共亨宏眾义和类型定义 一个程序的两个文件包含booleanh:伴define BOOL int#deine TRUE 1frdetine FALSE 0boolean

10、hhinclude nboolean.h11#include boolean h”PROGRAMMINGA Modern Approach kcco Copyright(B 2008 W W. Norton & Company.All rights reserved21第15战:編共宇宏农义和类型定义在头文件中,类型定义也很普遍.例如,我们可以使用typedef创建一个Boo丄 类型,取代BOOL宏.如果这样,boolean . h文件就有如下形式:#define TRUE 1#define FALSE 0typdf int Bool;C PROGRAMMINGA Modern Approac

11、fi mc .o ? _ nCopynght O 2008 W W. Norton & Company. All rights reserved.洽草:编吗大住程庁共亨宏处义和类型定义把宏和类型的定义放入头文件的好处:-节省时间我们不必拷贝宏到需要的地方.使程序容易修改姿改变宏或类型定义,只需要修 改头文件.-避免门月包含同样一个宏或类型的不同定义而导致 的不i致性.PROGRAMMINGA Modern Approach 乂【Copynght O 2008 W W. Norton & Company.All rights reserved.22第15沆:编吗大住榨庁共享函数原型假设一个源文件

12、含有对西数f的调用,而f定 义在另一个文件foo.c中.不加声明地调用f是危险的.-编译器认为f的返回类型是int.-它也认为参数的个数9调用时的口变量的个数一 致.C PROGRAMMINGA Modern Approach、心“丫 s-白变杲被白动地转为默认的类型.Copynght 2008 W W. Norton & Company. All rights reserved.共享函数原型在调用f的文件屮声明f可以解决上述问题,但 是又会带来维护的噩梦. 一个好的解决办法是把f的原型放入一个头文 件(foo.h),再把头文件包含进需要调用f的 文件中.我们也需要在foo.c中包含foo.h

13、,使编译器 可以检查foo.h中的f原型与foo.c中的定义 是否一致.PROGRAMMINGA Modern Appiwtch tcco wonCopynght (B 2008 W W. Norton & Company.All rights reserved24共享函数原型如果foo.c含有其他的歯数,大多可以在 f oo . h中声明.然而只打算在foo.c中使用的函数不应该声 明在头文件中.f PROGRAMMING25A Modern Appnmc/i 巴z 心A诂怡 reserved.莎7 5诅:编吗大住和宇共享函数原型可以用逆波兰式表达式计算器的例子显示头文件 中函数原型的使用.

14、 stack, c 文件屮含有 make_empty, is_empty, is_full, push,和pop函数的定义.这些函数的原型丿“该放入stack, h头文件中:void make_empty(void);int is_empty(void);int is_full(void);void push(int i);irit pop (void);PROGRAIVIMINGA Modem ApprvacJi tcco 3 小Copynght 2008 W W. Norton & Company.All rights reserved2615共享函数原型我们把stack . h包含在ca

15、lc.c中,允许编 译器检查栈函数调用.我们也把s tack. h包含在stack. c中,使编 译器能够检验stack.h中的函数原型与 stack . c中的定义相匹配. rPROGRAMMINGA Modern Apprxxich tcco w” onCopyright 2008 W W. Norton & Company.All rights reserved.28C PROGRAMMINGA Modern Approach mccmo 丫 omCopyright 2008 W W. Norton & Company. All rights reserved.共享函数原型void ma

16、koonpty ; int la *mpty(void!; int is full(voidl/ void pu: int pop void:;stackhsinclude stack.h*itinclude *stack. h lnt main (void! lnt concents(100); lnt top - 0;nBake_iipty U ;1void make empty i void i Jcalo.clnt ie_eKpty (void! )lnt is fuLl Ivoidl - ) void puehdnt 1) 2008 W W. Norton & Company.All

17、 rights reserved.32莎75歐缩弓大郴好共享变量声明当同一个变量的声明出现在不同的文件里时, 编译器不能检査变量的声明与定义是否一致.例如,一个文件有定义另一个文件有声明extern long i;c PROGRAMMINGA Modern Approach、心“ m这种错误会导致程序不町预知的行为表现.Copyright 2008 W W. Norton & Company.All rights reserved共享变量声明为了避免不一致,共享变量的声明通常放在头 文件里. 一个需要访问特定变暈的源文件可以将适当的 头文件包含进来.此外,每一个含有变量声叨的头文件也被包含 进

18、定义变量的源文件中,使得编译器能够检查 二者是否匹配.PROGRAMMINGA Modern Approach mcco Copyright 2008 W W. Norton & Company.All rights reserved.34第15験:編写大住和庁嵌套包含 一个头文件口J以含有#include stack, h含有下面的原型:int is_empty(void);int丄(void);既然这些因数只返冋0或1,把它们的返冋类型 声明为Bool类型是一个好主意:Bool is_empty (void);Bool is_full(void);我彳IJ需要在stackh屮包含boole

19、an.h,彳吏得 当stack. h被编译时Boo丄类型牛效.c PROGRAMMING35如“A Modz* Apprxmch 心AI1 励6wd嵌套包含传统上,c程序员避开嵌套包含.然而,反对嵌套包含的偏见C经很大程度地淡 化,部分因为嵌套包含在C+中很普遍.PROGRAMMINGA Modem Appixmch kccmg Copynght 2008 W W. Norton & Company.All rights reserved36沏5直:保护头文件如果一个源文件包含同一个头文件两次,就会 导致编译错误.当头文件包含其他的头文件时,这个问题很普 遍. 假设file 1h包含fi:Le

20、3 h,fiJLe2h包含 file3h, progc包含f ilelh和 file2 h.C PROGRAMMINGA Modern Apprwtc/i scc:o mCopynght (B 2008 W W. Norton & Company.All rights reservedPROGRAIVIMINGA Modem Approach ccco 心Copynght & 2008 W W. Norton & Company.All rights reserved.34保护头文件dueln-f 1 h.i rm3.n”file2.hfinclude -!rilel.h- #UicluU 当

21、prog. c被编译时.file3. h将被编译两次.保护头文件包含同一个头文件两次并非总导致编译错误.如杲文件只含有宏定义,函数原型和变量声明, 不会有困难.C PROGRAMMINGA Modern Apprwtch mc.o :如 _n然而如果文件含有类型沱义,就会出现编译错 误.Copyright 2008 W W. Norton & Company. All rights reserved.保护头文件为安全起见,一个好的做法是保护所仃的头文 件,避免重复包含.这样,我们可以增加类型定义而不会冇忘记保 护文件的风险.此外,我们很可能节省了时间,因为避免了不 必要的重复编译.PROGRA

22、MMINGA Modem Approach mccmo 时皿Copyright 2008 W W. Norton & Company.All rights reserved.40v; 15比編T大中朴保护头文件为了保护头文件,我们把文件内容放入 #ifndef#endif 屮怎样保护boolean . h文件:#ifndef BOOLEAN#define BOOLEANH#defineTRUE 1#def ineFALSE 0typedefint Bool;PROGRAIVIMINGA Modern ApprMch tcco Copyright 2008 W W. Norton & Compa

23、ny.All righis reserved.42c PROGRAIVIMINGA Modern Approach mc :o 3 .m#endifCopyright 2008 W W. Norton & Company. All righis reserved.保护头文件选取与头文件名和似的宏名是避免与其他宏冲 突的好办法.既然我们不能为宠取名BOOLEAN. H,像 BOOLEAN这样的名字是个好的选样.头文件中的#error指示 #error经常被放金头文件里用于检查头文件 不应被包含的条件.假设一个头文件使用了 C89标准之前没冇的特 征. #ifndef检验_STDC_ 宏是否存在:

24、#ifndef _STDC_terror This header requires a Standard C compiler #endifc PROGRAMMINGA Modern Approach、心“r .MCopynght 2008 W W. Norton & Company.All rights reserved15革:编吗大和序把程序分为文件设计程序涉及到确定需箜哪些函数,并把这些 函数组织成逻辑相关的组. 一旦程序设汁好,仃个简单的办法把程序分成 文件.PROGRAMMINGA Modern Approach “Copynght 2008 W W. Norton & Compan

25、y.All rights reserved4415把程序分为文件每个函数集形成一个单独的源文件(foo.c)每个源文件有个相应的头文件(foo.h)- foo.h含有定义在foo.c屮的函数的原型.只在foo . c中使用的函数不应该在foo.h中声明. 如果一个源文件要调用foo.c义的函数,就需婆把 foo.h包含进來. foo.h也应该被包含到foo.c屮,使得编译器能够检 验foo.h中的原型与foo.c中的定义和匹配.C PROGRAMMING45A Mod和 Appixmch stco.0 earsA材恰 reserved.莎15晟:编吗大住程庁把程序分为文件主函数放在一个文件中,

26、文件乳与程序需和配主函数所在的文件也可能含仃英他函数,只要 它们不被英他文件调用.PROGRAMMINGA Modern Apprwich、心。*Copynght O 2008 W W. Norton & Company.All rights reserved.46第15询:A程序设计:文本格式化我们把这项技术应用于一个名为justify的 文本格式化程序.假设文件quote含有如下输入:C is quirky/ flawed. and anenormous success.ALthough accidents ofhistorysurely helpedr it evidently sati

27、sfied a needfor a system implementationlanguageefficientenough to displaceassembly language,yet sufficiently abstract and fluent to describealgorithms andvarietyjfenvironmentsc PROGRAMMING的?t?c MlHinteractionsin a wide47 Denniopyrtght 0X)8 W W. Norton & Company.All rights resrr*pd程序设计:文本格式化在UNIX或Windows命令行运行程序,我们输 入如下命令justify quote 符号告诉操作系统justify将从文件quote 而不是从键盘接

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论