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

提交評論