版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第10章〓預(yù)處理命令10.1〓知識要點回顧10.1.1〓C語言的預(yù)處理在C語言中,并沒有任何內(nèi)在的機制來完成以下一些功能:在編譯時包含其他源文件、定義宏、根據(jù)條件決定編譯時是否包含某些代碼。要完成這些工作,就需要使用預(yù)處理程序。盡管在目前絕大多數(shù)C語言的編譯器都包含了預(yù)處理程序,但通常認(rèn)為它們是獨立于編譯器的。預(yù)處理過程先于編譯器對源代碼進(jìn)行處理。預(yù)處理過程掃描源代碼,檢查包含預(yù)處理指令的語句和宏定義,并對源代碼進(jìn)行響應(yīng)的轉(zhuǎn)換,產(chǎn)生新的源代碼提供給編譯器。預(yù)處理過程還會刪除程序中的注釋和多余的空白字符。C語言的預(yù)處理指令是以#號開頭的代碼行。#號必須是該行除了任何空白字符外的第一個字符。#后是指令關(guān)鍵字,在關(guān)鍵字和#號之間允許存在任意個數(shù)的空白字符。整行語句構(gòu)成了一條預(yù)處理指令,該指令將在編譯器進(jìn)行編譯之前對源代碼做某些轉(zhuǎn)換。C語言中常用的預(yù)處理指令如表10-1所示。表10-1〓C語言常用預(yù)處理命令指令用途#空指令,無任何效果#include包含一個源代碼文件#define定義宏#undef取消已定義的宏#ifdef如果宏已經(jīng)定義,則編譯下面代碼#ifndef如果宏沒有定義,則編譯下面代碼#if如果給定條件為真,則編譯下面代碼#else用于某個#if指令之后,當(dāng)前面的#if指令的條件不為真時,就編譯#else后面的代碼#endif結(jié)束一個#if…#else條件編譯塊10.1.2〓文件包含#include預(yù)處理指令的作用是在指令處展開被包含的文件。包含可以是多重的,也就是說一個被包含的文件中還可以包含其他文件。標(biāo)準(zhǔn)C編譯器至少支持八重嵌套包含。在程序中包含頭文件有兩種格式:#include<my.h>#include"my.h"第一種方法是用尖括號把頭文件括起來。這種格式告訴預(yù)處理程序在編譯器自帶的或外部庫的頭文件中搜索被包含的頭文件。第二種方法是用雙引號把頭文件括起來。這種格式告訴預(yù)處理程序在當(dāng)前被編譯的應(yīng)用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件。采用兩種不同包含格式的理由是:編譯器安裝在公共子目錄下,而被編譯的應(yīng)用程序在它們自己的私有子目錄。一個應(yīng)用程序既會包含編譯器提供的公共頭文件,也會包含自定義的私有頭文件。采用兩種不同的包含格式,可以使編譯器能夠在多個頭文件中區(qū)別出一組公共的頭文件。預(yù)處理過程不檢查在轉(zhuǎn)換單元中是否已經(jīng)包含了某個文件并阻止對它的多次包含。這樣就可以在多次包含同一個頭文件時,通過給定編譯時的條件來達(dá)到不同的效果。例如:#defineMYC#include"my.c"#undefMYC#include"my.c"以上代碼中my.c被兩次包含,但在my.c中可以根據(jù)MYC是否定義(define)而決定兩次包含時編譯的代碼不同。為了避免那些只能包含一次的頭文件被多次包含,可以在頭文件中用編譯時條件來進(jìn)行控制。例如,在my.h文件中使用如下預(yù)處理命令結(jié)構(gòu):#ifndefMY_H#defineMY_H〓……//被編譯語句#endif當(dāng)在其他文件中多次使用#include"my.h"時,my.h文件中的被編譯語句部分將只被編譯一次。10.1.3〓宏定義宏是一個被定義了用來代表特定內(nèi)容的標(biāo)識符。預(yù)處理過程會把源代碼中出現(xiàn)的宏標(biāo)識符替換成宏定義時的值。宏最常見的用法是定義代表某個值的全局符號。宏的第二種用法是定義帶參數(shù)的宏,這樣的宏可以像函數(shù)一樣被調(diào)用,但它是在調(diào)用語句處展開宏,并用調(diào)用時的實際參數(shù)來代替定義中的形式參數(shù)。1.#define指令#define預(yù)處理指令是用來定義宏的。該指令最簡單的格式是:首先申明一個標(biāo)識符,然后給出這個標(biāo)識符代表的代碼。在后面的源代碼中,就用這些代碼來替代該標(biāo)識符。作為一種約定,習(xí)慣上總是全部用大寫字母來定義宏,這樣易于把程序中的宏標(biāo)識符和一般變量標(biāo)識符區(qū)別開來。例如:#defineMAX_NUM10intarray[MAX_NUM];for(i=0;i<MAX_NUM;i++)/*……*/在這個例子中,對于閱讀該程序的人來說,符號MAX_NUM就有特定的含義,它代表的值給出了數(shù)組所能容納的最大元素數(shù)目。程序中可以多次使用這個值。如果想要改變數(shù)組的大小,只需要更改宏定義并重新編譯程序即可。宏表示的值可以是一個常量表達(dá)式,其中允許包括前面已經(jīng)定義的宏標(biāo)識符。例如:#defineX1#defineY2#defineZ(X+Y)上面的宏定義使用了括號,盡管它們并不是必須的,但出于謹(jǐn)慎考慮,還是應(yīng)該加上括號。例如:s=Z*Y;預(yù)處理過程把上面的一行代碼轉(zhuǎn)換成:s=(X+Y)*Y;并進(jìn)而轉(zhuǎn)換成:s=(1+2)*2;如果沒有那個括號,就轉(zhuǎn)換成:s=X+Y*Y;并進(jìn)而轉(zhuǎn)換成:s=1+2*2;可以看出兩者區(qū)別非常大。宏還可以代表一個字符串常量。例如:#defineNIT"南昌工程學(xué)院"2.帶參數(shù)的#define指令帶參數(shù)的宏和函數(shù)調(diào)用看起來有些相似。例如:#defineAdd(x,y)((x)+(y))在使用時,可用任何數(shù)字表達(dá)式甚至函數(shù)調(diào)用來代替參數(shù)x和y。例如,假設(shè)a和b已經(jīng)定義了,則以下的代碼:a=4;b=7*Add(5,6+a)*8;將會轉(zhuǎn)換成:a=4;b=7*((5)+(6+a))*8;在這里仍然要提醒大家注意括號的使用。若上面的宏定義不帶括號:#defineAdd(x,y)x+y則以下的代碼:a=4;b=7*Add(5,6+a)*8;將會轉(zhuǎn)換成:a=4;b=7*5+6+a*8;10.1.4〓條件編譯指令條件編譯指令將決定哪些代碼被編譯,而哪些不被編譯。通常,可以根據(jù)表達(dá)式的值或者某個特定的宏是否被定義來確定編譯條件。1.#if和#endif#if指令檢測跟在其后的常量表達(dá)式(通常是一個宏),如果該表達(dá)式為真,則編譯后面的代碼,直到出現(xiàn)#else、#elif或#endif為止;否則不編譯。#endif用于終止#if預(yù)處理指令。例如:#defineDEBUG0main(){〓#ifDEBUG〓〓printf("Debugging\n");〓#endif〓printf("Running\n");}上面的程序代碼中,由于程序定義DEBUG宏代表0,所以#if條件為假,不編譯后面的代碼直到#endif,所以程序直接輸出Running。如果去掉#define語句,效果是一樣的。2.#ifdef和#ifndef#ifdef表示如果其后的宏已經(jīng)定義,則編譯下面代碼;#ifndef則表示如果其后的宏沒有定義,則編譯下面代碼。例如:#defineDEBUGmain(){〓#ifdefDEBUG〓〓printf("yes\n");〓#endif〓#ifndefDEBUG〓〓printf("no\n");〓#endif}以上程序運行結(jié)果為yes。若將#defineDEBUG刪除,運行結(jié)果為no。#ifdefined等價于#ifdef;#if!defined等價于#ifndef3.#else#else指令用于某個#if指令之后,當(dāng)前面的#if指令的條件不為真時,就編譯#else后面的代碼。#endif指令將中指上面的條件塊。例如:#defineDEBUGmain(){〓#ifdefDEBUG〓〓printf("Debugging\n");〓#else〓〓printf("Notdebugging\n");〓#endif}以上程序運行結(jié)果為Debugging。若將#defineDEBUG刪除,運行結(jié)果為Notdebugging。10.2〓實訓(xùn)內(nèi)容實驗一〓驗證性實驗一、實驗?zāi)康恼莆粘S妙A(yù)處理指令的使用方法。二、實驗設(shè)備和儀器(1)IBMPC或兼容計算機。(2)Windows9x/2000/XP操作系統(tǒng)。(3)VisualC++6.0。三、實驗內(nèi)容(一)調(diào)試程序11.實驗要求調(diào)試程序,驗證程序中如何多次包含只能包含一次的my.h頭文件。2.程序代碼ex10_1.c#include<stdio.h>#include"my.h"#include"ex10_1.h"main(){〓printf("a=%d\n",a);〓printf("MAX(3,5)=%d\n",MAX(3,5));〓printf("MAX(3,5,4)=%d\n",MAXEX(3,5,4));}ex10_1.h代碼如下:#include"my.h"#defineMAXEX(x,y,z)(MAX(x,y)>z?MAX(x,y):z)my.h代碼如下:inta=3;#defineMAX(x,y)(x>y?x:y)3.實驗步驟步驟一:在D盤的根目錄中創(chuàng)建一個以你的學(xué)號命名的文件夾,如D:\200710003。步驟二:打開“MicrosoftVisualC++”軟件,分別建立ex10_1.c、ex10_1.h和my.h文件,輸入源代碼并保存。步驟三:編譯ex10_1.c程序,系統(tǒng)報錯,如圖10-1所示。圖10-1〓ex10_1程序編譯報錯步驟四:將my.h文件修改如下:#ifndef_MY_H〓#define_MY_H1〓inta=3;〓#defineMAX(x,y)(x>y?x:y)#endif步驟五:再次編譯ex10_1.c程序,系統(tǒng)沒有報錯,程序運行結(jié)果如圖10-2所示。圖10-2〓ex10_1正確執(zhí)行(二)調(diào)試程序21.實驗要求調(diào)試程序,驗證宏定義時帶括號與不帶括號的區(qū)別。。2.程序代碼ex10_2.c#include<stdio.h>#defineX1#defineY2#defineZ(X+Y)main(){〓ints;〓s=Z*Y;〓printf("s=%d\n",s);}3.實驗步驟步驟一:打開“MicrosoftVisualC++”軟件,建立ex10_2.c文件,輸入源代碼并保存。步驟二:編譯并運行程序,程序運行結(jié)果如圖10-3所示。s的值等于(1+2)*2=6。圖10-3〓ex10_2中宏定義帶括號執(zhí)行結(jié)果步驟三:將程序中的#defineZ(X+Y)中的括號刪除,變成#defineZX+Y后,再次編譯運行程序,程序運行結(jié)果如圖10-4所示。s的值等于1+2*2=5。圖10-4〓ex10_2中宏定義不帶括號執(zhí)行結(jié)果(三)調(diào)試程序31.實驗要求調(diào)試程序,驗證帶參數(shù)宏定義的使用。2.程序代碼ex10_3.c#include<stdio.h>#defineAdd(x,y)((x)+(y))main(){〓inta,b;〓a=4;〓b=7*Add(5,6+a)*8;〓printf("b=%d\n",b);}3.實驗步驟步驟一:打開“MicrosoftVisualC++”軟件,建立ex10_3.c文件,輸入源代碼并保存。步驟二:編譯并運行程序,程序運行結(jié)果如圖10-5所示。b的值為7*(5+(6+4))*8。圖10-5〓ex10_3第一次執(zhí)行結(jié)果步驟三:將程序中的:#defineAdd(x,y)((x)+(y))修改為:#defineAdd(x,y)x+y再次編譯運行程序,程序運行結(jié)果如圖10-6所示。b的值為7*5+6+4*8。圖10-6〓ex10_3第二次執(zhí)行結(jié)果(四)調(diào)試程序41.實驗要求調(diào)試程序,驗證#if和#endif的使用。2.程序代碼ex10_4.c#include<stdio.h>#defineDEBUG0main(){〓#ifDEBUG〓〓printf("Debugging\n");〓#endif〓printf("Running\n");}3.實驗步驟步驟一:打開“MicrosoftVisualC++”軟件,建立ex10_4.c文件,輸入源代碼并保存。步驟二:編譯并運行程序,程序運行結(jié)果如圖10-7所示。圖10-7〓ex10_4第一次執(zhí)行結(jié)果步驟三:將程序中的:#defineDEBUG0修改為:#defineDEBUG1再次編譯運行程序,程序運行結(jié)果如圖10-8所示。圖10-8〓ex10_48第二次執(zhí)行結(jié)果(五)調(diào)試程序51.實驗要求調(diào)試程序,驗證#ifdef和#ifndef以及#else的使用。2.程序代碼ex10_5.c#include<stdio.h>#defineDEBUGmain(){〓#ifdefDEBUG〓〓printf("Debugging\n");〓#else〓〓printf("Notdebugging\n");〓#endif}3.實驗步驟步驟一:打開“MicrosoftVisualC++”軟件,建立ex10_5.c文件,輸入源代碼并保存。步驟二:編譯并運行程序,程序運行結(jié)果如圖10-9所示。圖10-9〓ex10_5第一次執(zhí)行結(jié)果步驟三:將程序中的:#defineDEBUG修改為://#defineDEBUG再次編譯運行程序,程序運行結(jié)果如圖10-10所示。圖10-10〓ex10_5第二次執(zhí)行結(jié)果步驟四:將程序中的:#ifdefDEBUG修改為:#ifndefDEBUG再次編譯運行程序,程序運行結(jié)果如圖10-11所示。圖10-11〓ex10_5第三次執(zhí)行結(jié)果步驟五:將程序中的://#defineDEBUG修改為:#defineDEBUG再次編譯運行程序,程序運行結(jié)果如圖10-12所示。圖10-12〓ex10_5第四次執(zhí)行結(jié)果五、實驗報告要求(1)寫出以上五個程序的實驗原理與考查知識點,并分析說明程序每次運行的結(jié)果。(2)寫出在程序調(diào)試過程中遇到的問題和解決方法。實驗二〓啟發(fā)性實驗一、實驗?zāi)康?1)掌握預(yù)處理程序設(shè)計與調(diào)試的方法。(2)掌握預(yù)處理程序填空的方法。(3)掌握預(yù)處理程序改錯技巧。二、實驗設(shè)備和儀器(1)IBMPC或兼容計算機。(2)Windows9x/2000/XP操作系統(tǒng)。(3)VisualC++6.0。三、實驗準(zhǔn)備(1)預(yù)習(xí)C語言預(yù)處理常用指令的用法。(2)在D盤的根目錄中創(chuàng)建一個以你的學(xué)號命名的文件夾,如D:\200710003。四、實驗內(nèi)容1.填空題甲乙丙丁四人同時開始放鞭炮,甲每隔t1秒放一次,乙每隔t2秒放一次,丙每隔t3秒放一次,丁每隔t4秒放一次,每人各放n次。函數(shù)fun的功能是根據(jù)形參提供的值,求出總共聽到多少次鞭炮聲作為函數(shù)值返回。注意,當(dāng)幾個鞭炮同時炸響,只算一次響聲,第一次響聲是在第0秒。例如,若t1=7,t2=5,t3=6,t4=4,n=10,則總共可聽到28次鞭炮聲。請在程序的下劃線處填入正確的內(nèi)容并把下劃線刪除,使程序得出正確的結(jié)果。源程序文件取名為ex10blank.c。不得增行或刪行,也不得更改程序的結(jié)構(gòu)!源程序如下:#include<stdio.h>/**********found**********/#defineOK(i,t,n)((____1___%t==0)&&(i/t<n))intfun(intt1,intt2,intt3,intt4,intn){〓intcount,t,maxt=t1;〓if(maxt<t2)maxt=t2;〓if(maxt<t3)maxt=t3;〓if(maxt<t4)maxt=t4;〓count=1;/*給count賦初值*/〓/**********found**********/〓for(t=1;t<maxt*(n-1);___2___)〓{〓〓if(OK(t,t1,n)||OK(t,t2,n)||OK(t,t3,n)||OK(t,t4,n))〓〓count++;〓}〓/**********found**********/〓return___3___;}main(){〓intt1=7,t2=5,t3=6,t4=4,n=10,r;〓r=fun(t1,t2,t3,t4,n);〓printf("T
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2020-2025年中國安裝工程市場運行態(tài)勢及行業(yè)發(fā)展前景預(yù)測報告
- 2025年中國醫(yī)用光學(xué)器具行業(yè)市場全景監(jiān)測及投資前景展望報告
- 房屋買賣糾紛解決協(xié)議書(2篇)
- 2024-2030年中國互聯(lián)網(wǎng)+彩妝行業(yè)市場發(fā)展監(jiān)測及投資潛力預(yù)測報告
- 2025年三氯苯唑項目可行性研究報告
- 2024年圓珠筆芯行業(yè)發(fā)展監(jiān)測及投資前景預(yù)測報告
- 2024-2030年中國軟件代理行業(yè)發(fā)展運行現(xiàn)狀及投資戰(zhàn)略規(guī)劃報告
- 2024年省教育行業(yè)市場前景預(yù)測及投資戰(zhàn)略研究報告
- 2025年溫泉旅游項目評估報告
- 中國資產(chǎn)托管行業(yè)市場發(fā)展現(xiàn)狀及前景趨勢與投資分析研究報告(2024-2029版)
- 馬工程《經(jīng)濟法學(xué)》教學(xué)
- 《集裝箱結(jié)構(gòu)》課件
- 項目績效和獎勵計劃
- 光伏自發(fā)自用項目年用電清單和消納計算表
- 量子計算在醫(yī)學(xué)圖像處理中的潛力
- 阿里商旅整體差旅解決方案
- 浙江天臺歷史文化名城保護(hù)規(guī)劃說明書
- 邏輯思維訓(xùn)練500題
- 實體瘤療效評價標(biāo)準(zhǔn)RECIST-1.1版中文
- 企業(yè)新春茶話會PPT模板
- GB/T 19185-2008交流線路帶電作業(yè)安全距離計算方法
評論
0/150
提交評論