C語言程序設計課件 第9章_第1頁
C語言程序設計課件 第9章_第2頁
C語言程序設計課件 第9章_第3頁
C語言程序設計課件 第9章_第4頁
C語言程序設計課件 第9章_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第9章編譯預處理9.1文件包含9.2宏定義9.3條件編譯9.4預處理命令的綜合示例本章小結

9.1文件包含

9.1.1文件包含命令的作用如果文件A中有一條文件包含預處理命令,如:#include<B>則該命令將指定文件B的內容復制到文件A中“#include<B>”命令處的位置,共同組成一個程序文件,即在文件A中產(chǎn)生文件B的一個副本。

例如:

圖9-1所示是一個文件包含關系的示意圖。文件file1.c中的包含命令“#include"file2.c"”將文件file2.c復制進文件file1.c中。圖(a)和圖(b)所示是預處理前的情況,圖(c)是將文件file2.c復制文件file1.c之后的file1.c結構示意圖。圖9-1文件包含關系的示意圖

9.1.2#include命令的兩種格式

#include命令有兩種格式:

格式一:#include<文件名>

格式二:#include"文件名"

兩種格式的區(qū)別是:用尖括號時,系統(tǒng)到存放C語言庫函數(shù)頭文件所在的目錄(一般是C編譯系統(tǒng)的include子目錄)中尋找要復制的文件(這稱為標準方式)。用雙引號時,系統(tǒng)先在用戶當前目錄中或指定目錄中尋找要復制的文件,若找不到,再按標準方式查找(即按尖括號的方式查找)。

通常,如果為調用系統(tǒng)庫函數(shù)而用“#include”命令來復制相應的頭文件(如stdio.h、math.h、string.h等),宜采用尖括號,以節(jié)省查找時間。如果要復制的文件是用戶自己定義的(這種文件一般都位于當前目錄下),宜采用雙引號。

在程序設計中,文件包含是很有用的。一個大的程序可以分為多個模塊,由多個程序員分別編程。有些公用的符號常量或宏定義等可單獨組成一個文件,在其他文件的開頭用復制命令包含該文件即可使用。這樣,可避免在每個文件開頭都去書寫那些公用的量,從而節(jié)省時間,并減少出錯。

例9-1設計一個求n!的函數(shù),存放于文件exam.c中,然后設計主函數(shù)文件file.c,計算p=n!/m!/(n-m)!。

9.2宏定義

宏定義有兩種,即不帶參數(shù)的宏和帶參數(shù)的宏。宏定義的作用是用標識符來代表一字符串,一旦對字符串命名,就可在源程序中使用宏定義標識符,系統(tǒng)編譯之前會自動查找標識符并替換成字符串。

9.2.1不帶參數(shù)的宏

不帶參數(shù)的宏定義的一般形式為

#define宏名宏體

其中:“#”表示這是一條預處理命令;“define”為宏定義命令;“宏名”為一個合法的標識符,一般建議用大寫字母,以與變量名相區(qū)別;“宏體”可以是常數(shù)、表達式或語句,甚至可以是多條語句。define、宏名、宏體三者之間要用一個或多個空格分隔。

例如:

#definePI3.1415926

在預處理時,系統(tǒng)在該宏定義以后查找出現(xiàn)的每一個宏名都用宏體來代替,這個過程叫宏替換。

例9-2求球的表面積和體積。

在預處理時,系統(tǒng)會查找main()函數(shù)中的宏PI并用宏體3.141?592?6替換。預編譯后文件將變?yōu)?/p>

例9-3使用無參宏定義格式控制輸出。

程序運行結果為

Wangyi1308001621.00

Liwei1308002612.00

采用宏定義后,如果要修改PI值,只需在宏定義處修改PI值,而不需在計算面積和體積等多處修改,減少了代碼修改量,降低了程序出錯的可能性,提高了程序的健壯性。

9.2.2帶參數(shù)的宏

帶參數(shù)宏定義的一般形式為

#define宏名(參數(shù))宏體

例如

#defineSQR(x)(x)*(x)

#defineMOD(x,y)(x)%(y)

預處理時,系統(tǒng)在用宏體代替宏名的同時,實在參數(shù)會代替宏體中形式參數(shù),同樣宏替換仍只是一種簡單的查找替換,不能進行計算或實現(xiàn)其他的功能。

當程序出現(xiàn)下列語句時:

y=SQR(a+b);

程序在預處理時,將被替換成如下語句:

y=(a+b)*(a+b);

例9-4帶參宏定義示例。

帶參數(shù)的宏定義可以嵌套調用其他已存在的宏,即下一個宏定義的宏體可以出現(xiàn)上面已經(jīng)定義過的宏名。

例如:

#defineSQR(x)(x)*(x)

#defineCUBE(x)SQR(x)*(x)

語句CUBE(a+b)進行宏展開后,變?yōu)?/p>

(a+b)*(a+b)*(a+b)

例9-5比較宏定義中括號的使用方法的示例。

程序運行結果為

輸入一個數(shù):3

SQ1:sq=16

SQ2:sq=7

SQ3:sq=16

SQ1:sq=160

SQ2:sq=57

SQ3:sq=10

在宏替換中,不管有無參數(shù),宏名總是原封不動替換成定義串,當定義串中帶有括號時,替換時這些括號原樣出現(xiàn)在替換結果中,即宏定義串中的括號不是運算符,僅表示括號符號。對于SQ2、SQ3的宏來說,若替換方式為

sq=160/SQ2(a+1);sq=160/SQ3(a+1);

即將參數(shù)a+1分別傳入宏SQ2和SQ3中,有無括號的替換對結果的影響很大。SQ2被替換成“160/a+1*a+1”;而SQ3替換后可表示為“160/((a+1)*(a+1))”。

9.3條件編譯

C語言提供了條件編譯的預處理命令,可以按不同的條件去編譯不同的程序部分,進而產(chǎn)生不同的目標代碼文件。一般情況下,源程序的所有語句都會參加編譯。但有時若希望只對其中的部分滿足條件的語句進行編譯,則要用到“條件編譯”。條件編譯是在對源程序編譯之前的處理中,根據(jù)給定的條件,決定只編譯其中的某一部分源程序,而不編譯另外一部分源程序(塊刪除)。條件編譯有3種格式。

1.格式一

條件編譯格式一的一般形式為

#ifdef標識符

程序段1

#else

程序段2

#endif

條件編譯格式的功能:如果標識符已經(jīng)被“#define”命令定義過,則當程序編譯時只對程序段1進行編譯,否則只對程序段2進行編譯。其中的程序段可以是一條語句,也可以是一組語句。如果是一組語句,不必像復合語句一樣加上花括號。

例9-6條件編譯格式一的示例。

例9-7條件編譯#if-#else-#endif的用法示例。

程序運行結果為

選用較小的值編譯.

程序的編譯過程取決于MAX定義的大小,當MAX>99時,使用#if部分編譯,而#else部分是不進行編譯的,反之亦然。

在程序的第1行宏定義中,定義MAX表示常量10,在本例中表示一個數(shù)值。若條件判斷為非0的數(shù)表示真,否則為假。MAX也可以為任何字符串,可以根據(jù)需要自行定義符號常量,只要定義了,就編譯滿足條件的部分。

2.格式二

條件編譯格式二的一般形式為

#ifndef標識符

程序段1

#else

程序段2

#endif

格式二與格式一的不同之處是將“ifdef”改成“ifndef”。其功能是:如果標識符沒有被“#define”命令定義過,則當程序編譯時只對程序段1進行編譯,否則只對程序段2進行編譯。這與格式一的功能恰好相反。

例9-8利用條件編譯,計算面積。

3.格式三

條件編譯格式三的一般形式為

#if常量表達式

程序段1

#else

程序段2

#endif

條件編譯格式三的功能:如果常量表達式的值為真(即非0),則當程序編譯時只對程序段1進行編譯,否則只對程序段2進行編譯。

例9-9條件編譯格式三的示例。

條件編譯當然也可用條件語句(if語句)來實現(xiàn),但若用條件語句將會對整個源程序進行編譯,造成目標程序長,可執(zhí)行程序的運行時間長;而采用條件編譯,可減少被編譯的語句,從而減少了目標程序的長度和可執(zhí)行程序的運行時間(少了關系運算并跳轉的時間)。

9.4預處理命令的綜合示例

例9-10用條件編譯輸入一行電報文字,破解電報的密碼是每個字母都會被輸出到字母表對應的下一個字母。

例9-11三角形面積公式為

,其中S?=?(a?+?b?+?c?)/2,a、b、c為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論