版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第15章編寫大型程序PROGRAIVIMINGA Modern Approach mcoo mr.onAl r*h 2008 W W. Norton & Company. All rights reserved源文件將一個(gè)程序分為多個(gè)源文件有重大好處:把相關(guān)的函數(shù)和變暈放入一個(gè)文件中冇助丁澄清程 序的結(jié)構(gòu).-每個(gè)源文件對(duì)以單獨(dú)編譯,節(jié)省時(shí)間.-曲數(shù)能夠更容易地川r工他程序中.PROGRAMMINGA Modern Apprxxtc/i mcco *Copyright (B 2008 W W. Norton & Company.All rights reserved8莎15 E :編嗎大住和頭文
2、件當(dāng)一個(gè)程序分為兒個(gè)源文件時(shí),會(huì)有如下問(wèn)題:-一個(gè)文件中的函數(shù)怎樣調(diào)用在另一個(gè)文件屮定義的 函數(shù)?-兇數(shù)怎樣訪問(wèn)其他文件中的外部變最?-兩個(gè)文件怎樣共亨相同的宏定義和類型定義?答案在于#include,它使多個(gè)文件共享信息 成為可能.f PROGRAIVIIVIING9A Modern Apprwic/i 巴* msA詁怡 reserved.莎75斎:編弓大住用字頭文件 #include告訴預(yù)處理器把指定的文件內(nèi)容插 入進(jìn)來(lái).多個(gè)文件需要共享的信息可以放入這樣一個(gè)文 件中.然JuR#include就可以把這個(gè)文件的內(nèi)容包 含到每一個(gè)源文件中.這樣被包含進(jìn)來(lái)的文件就叫頭文件(有時(shí)也叫 包含文件)
3、.依照慣例,頭文件具有h擴(kuò)展名.PROGRAMMINGA Modern AppttmcJi、心mCopynght 2008 W W. Norton & Company.All rights reserved.10v; 15 士爲(wèi)打大住樸#include #include有兩種匸要形式.種用于C庫(kù)中的頭文件:#include 另一種用于所令的其他頭文件:#include filename”兩者的不同之處在于編譯器如何確定頭文件的 位置.f PROGRAMMINGA Modem Approach tcoo a3旳s reserved.仍75氏縮弓大空程宇#include定位頭文件的典型規(guī)則:-#i
4、nclude :查找系統(tǒng)頭文件所在的路徑.-#include filename:令:找為前路徑,然肩資找系 統(tǒng)頭文件所在的路徑.查找頭文件的位置可以改變,通常通過(guò)命令行 選項(xiàng),例如-Tpath.PROGRAMMINGA Modef Apprwtch如Copynght 2008 W W. Norton & Company.All rights reserved.12第15老:編嗎大空和庁#include不要用尖括號(hào)包含你寫的文件:#include /* WRONG * */預(yù)處理器可能會(huì)在系統(tǒng)頭文件所在的地方尋找myheader hf PROGRAMMING13A Moder* Appmich
5、巴z mgA材恰 reserved.莎15老:編弓大住用庁#include # include指示中的文件名可以包含盤符和路 徑:#include nc:cprogsutilsh/* Windows path */#include n/cprogs/utilshn/* UNIX path */雖然ttinclude中的引號(hào)使文件名看起來(lái)像字 符串,但是預(yù)處理器不會(huì)那樣處理.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 :計(jì)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是任意的預(yù)處理符號(hào)序列.預(yù)處理器將掃描符號(hào)并用找到的宏替換它.右二宏替換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草:編弓大黎程庁共亨宏眾義和類型疋義大多數(shù)大型程序擁有多個(gè)源文件共享的宏定義 和類型定義.這些定義應(yīng)該放入頭文件中.PROGRAMMINGA ModcrN Approach mcco Copyright 2008 W W. Norton & Company.All rights reserved1815直:編弓大申和宇共寧宏眾義和
9、類型定義 設(shè)程序使用宏BOOL, TRUE,和FALSE.它們的定義可以放入一個(gè)頭文件booleanh 中:#define BOOL int#define TRUE 1#define FALSE 0任何需要這些宏的源文件町以簡(jiǎn)單地使用#include boolean .hffC PROGRAIVIIVIING19A 伽d和 Appnch stco.0 u.r.oNAll riflhls reserved.第=5草:編弓大牛J程宇共亨宏眾義和類型定義 一個(gè)程序的兩個(gè)文件包含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戰(zhàn):編共宇宏農(nóng)義和類型定義在頭文件中,類型定義也很普遍.例如,我們可以使用typedef創(chuàng)建一個(gè)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.洽草:編嗎大住程庁共亨宏處義和類型定義把宏和類型的定義放入頭文件的好處:-節(jié)省時(shí)間我們不必拷貝宏到需要的地方.使程序容易修改姿改變宏或類型定義,只需要修 改頭文件.-避免門月包含同樣一個(gè)宏或類型的不同定義而導(dǎo)致 的不i致性.PROGRAMMINGA Modern Approach 乂【Copynght O 2008 W W. Norton & Company.All rights reserved.22第15沆:編嗎大住榨庁共享函數(shù)原型假設(shè)一個(gè)源文件
12、含有對(duì)西數(shù)f的調(diào)用,而f定 義在另一個(gè)文件foo.c中.不加聲明地調(diào)用f是危險(xiǎn)的.-編譯器認(rèn)為f的返回類型是int.-它也認(rèn)為參數(shù)的個(gè)數(shù)9調(diào)用時(shí)的口變量的個(gè)數(shù)一 致.C PROGRAMMINGA Modern Approach、心“丫 s-白變杲被白動(dòng)地轉(zhuǎn)為默認(rèn)的類型.Copynght 2008 W W. Norton & Company. All rights reserved.共享函數(shù)原型在調(diào)用f的文件屮聲明f可以解決上述問(wèn)題,但 是又會(huì)帶來(lái)維護(hù)的噩夢(mèng). 一個(gè)好的解決辦法是把f的原型放入一個(gè)頭文 件(foo.h),再把頭文件包含進(jìn)需要調(diào)用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共享函數(shù)原型如果foo.c含有其他的歯數(shù),大多可以在 f oo . h中聲明.然而只打算在foo.c中使用的函數(shù)不應(yīng)該聲 明在頭文件中.f PROGRAMMING25A Modern Appnmc/i 巴z 心A詁怡 reserved.莎7 5詛:編嗎大住和宇共享函數(shù)原型可以用逆波蘭式表達(dá)式計(jì)算器的例子顯示頭文件 中函數(shù)原型的使用.
14、 stack, c 文件屮含有 make_empty, is_empty, is_full, push,和pop函數(shù)的定義.這些函數(shù)的原型丿“該放入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共享函數(shù)原型我們把stack . h包含在ca
15、lc.c中,允許編 譯器檢查棧函數(shù)調(diào)用.我們也把s tack. h包含在stack. c中,使編 譯器能夠檢驗(yàn)stack.h中的函數(shù)原型與 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.共享函數(shù)原型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歐縮弓大郴好共享變量聲明當(dāng)同一個(gè)變量的聲明出現(xiàn)在不同的文件里時(shí), 編譯器不能檢査變量的聲明與定義是否一致.例如,一個(gè)文件有定義另一個(gè)文件有聲明extern long i;c PROGRAMMINGA Modern Approach、心“ m這種錯(cuò)誤會(huì)導(dǎo)致程序不町預(yù)知的行為表現(xiàn).Copyright 2008 W W. Norton & Company.All rights reserved共享變量聲明為了避免不一致,共享變量的聲明通常放在頭 文件里. 一個(gè)需要訪問(wèn)特定變暈的源文件可以將適當(dāng)?shù)?頭文件包含進(jìn)來(lái).此外,每一個(gè)含有變量聲叨的頭文件也被包含 進(jìn)
18、定義變量的源文件中,使得編譯器能夠檢查 二者是否匹配.PROGRAMMINGA Modern Approach mcco Copyright 2008 W W. Norton & Company.All rights reserved.34第15験:編寫大住和庁嵌套包含 一個(gè)頭文件口J以含有#include stack, h含有下面的原型:int is_empty(void);int丄(void);既然這些因數(shù)只返冋0或1,把它們的返冋類型 聲明為Bool類型是一個(gè)好主意:Bool is_empty (void);Bool is_full(void);我彳IJ需要在stackh屮包含boole
19、an.h,彳吏得 當(dāng)stack. h被編譯時(shí)Boo丄類型牛效.c PROGRAMMING35如“A Modz* Apprxmch 心AI1 勵(lì)6wd嵌套包含傳統(tǒng)上,c程序員避開(kāi)嵌套包含.然而,反對(duì)嵌套包含的偏見(jiàn)C經(jīng)很大程度地淡 化,部分因?yàn)榍短装贑+中很普遍.PROGRAMMINGA Modem Appixmch kccmg Copynght 2008 W W. Norton & Company.All rights reserved36沏5直:保護(hù)頭文件如果一個(gè)源文件包含同一個(gè)頭文件兩次,就會(huì) 導(dǎo)致編譯錯(cuò)誤.當(dāng)頭文件包含其他的頭文件時(shí),這個(gè)問(wèn)題很普 遍. 假設(shè)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保護(hù)頭文件dueln-f 1 h.i rm3.n”file2.hfinclude -!rilel.h- #UicluU 當(dāng)
21、prog. c被編譯時(shí).file3. h將被編譯兩次.保護(hù)頭文件包含同一個(gè)頭文件兩次并非總導(dǎo)致編譯錯(cuò)誤.如杲文件只含有宏定義,函數(shù)原型和變量聲明, 不會(huì)有困難.C PROGRAMMINGA Modern Apprwtch mc.o :如 _n然而如果文件含有類型沱義,就會(huì)出現(xiàn)編譯錯(cuò) 誤.Copyright 2008 W W. Norton & Company. All rights reserved.保護(hù)頭文件為安全起見(jiàn),一個(gè)好的做法是保護(hù)所仃的頭文 件,避免重復(fù)包含.這樣,我們可以增加類型定義而不會(huì)冇忘記保 護(hù)文件的風(fēng)險(xiǎn).此外,我們很可能節(jié)省了時(shí)間,因?yàn)楸苊饬瞬?必要的重復(fù)編譯.PROGRA
22、MMINGA Modem Approach mccmo 時(shí)皿Copyright 2008 W W. Norton & Company.All rights reserved.40v; 15比編T大中樸保護(hù)頭文件為了保護(hù)頭文件,我們把文件內(nèi)容放入 #ifndef#endif 屮怎樣保護(hù)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.保護(hù)頭文件選取與頭文件名和似的宏名是避免與其他宏沖 突的好辦法.既然我們不能為寵取名BOOLEAN. H,像 BOOLEAN這樣的名字是個(gè)好的選樣.頭文件中的#error指示 #error經(jīng)常被放金頭文件里用于檢查頭文件 不應(yīng)被包含的條件.假設(shè)一個(gè)頭文件使用了 C89標(biāo)準(zhǔn)之前沒(méi)冇的特 征. #ifndef檢驗(yàn)_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革:編嗎大和序把程序分為文件設(shè)計(jì)程序涉及到確定需箜哪些函數(shù),并把這些 函數(shù)組織成邏輯相關(guān)的組. 一旦程序設(shè)汁好,仃個(gè)簡(jiǎn)單的辦法把程序分成 文件.PROGRAMMINGA Modern Approach “Copynght 2008 W W. Norton & Compan
25、y.All rights reserved4415把程序分為文件每個(gè)函數(shù)集形成一個(gè)單獨(dú)的源文件(foo.c)每個(gè)源文件有個(gè)相應(yīng)的頭文件(foo.h)- foo.h含有定義在foo.c屮的函數(shù)的原型.只在foo . c中使用的函數(shù)不應(yīng)該在foo.h中聲明. 如果一個(gè)源文件要調(diào)用foo.c義的函數(shù),就需婆把 foo.h包含進(jìn)來(lái). foo.h也應(yīng)該被包含到foo.c屮,使得編譯器能夠檢 驗(yàn)foo.h中的原型與foo.c中的定義和匹配.C PROGRAMMING45A Mod和 Appixmch stco.0 earsA材恰 reserved.莎15晟:編嗎大住程庁把程序分為文件主函數(shù)放在一個(gè)文件中,
26、文件乳與程序需和配主函數(shù)所在的文件也可能含仃英他函數(shù),只要 它們不被英他文件調(diào)用.PROGRAMMINGA Modern Apprwich、心。*Copynght O 2008 W W. Norton & Company.All rights reserved.46第15詢:A程序設(shè)計(jì):文本格式化我們把這項(xiàng)技術(shù)應(yīng)用于一個(gè)名為justify的 文本格式化程序.假設(shè)文件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程序設(shè)計(jì):文本格式化在UNIX或Windows命令行運(yùn)行程序,我們輸 入如下命令justify quote 符號(hào)告訴操作系統(tǒng)justify將從文件quote 而不是從鍵盤接
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度水利工程砂石供應(yīng)及售后服務(wù)合同3篇
- 2024年度高品質(zhì)房產(chǎn)與土地權(quán)益轉(zhuǎn)讓合同3篇
- 2024年度知識(shí)產(chǎn)權(quán)許可合同:某專利技術(shù)國(guó)內(nèi)外許可使用3篇
- 2024年度書畫展覽策劃合同
- 2024版出境旅游文化體驗(yàn)深度游合同3篇
- 2024年度荒山健康養(yǎng)生園開(kāi)發(fā)承包合同3篇
- 2024版二手房提前交房物業(yè)費(fèi)繳納及使用協(xié)議3篇
- 2024年度高端二手住宅出售全權(quán)委托服務(wù)協(xié)議3篇
- 2024年民間借貸合同法律風(fēng)險(xiǎn)防范服務(wù)合同3篇
- 2024年度食品加工廠供應(yīng)協(xié)議3篇
- 2024年中考英語(yǔ)二輪復(fù)習(xí):語(yǔ)法填空講解
- 走進(jìn)歌劇世界智慧樹(shù)知到期末考試答案章節(jié)答案2024年北京航空航天大學(xué)
- 三字經(jīng)英文版-趙彥春
- 婦科腫瘤微創(chuàng)手術(shù)
- DL-T 5148-2021水工建筑物水泥灌漿施工技術(shù)條件-PDF解密
- 高三班高考前心理疏導(dǎo)主題班會(huì)
- 500字作文標(biāo)準(zhǔn)稿紙A4打印模板-直接打印
- GB/T 22849-2024針織T恤衫
- 2024年國(guó)家電網(wǎng)招聘之通信類題庫(kù)及答案【名師系列】
- GB/Z 43684-2024納米技術(shù)光柵的描述、測(cè)量和尺寸質(zhì)量參數(shù)
- 《籃球運(yùn)動(dòng)員的選材》課件
評(píng)論
0/150
提交評(píng)論