




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
C語言程序設(shè)計TheCProgrammingLanguage華中科技大學(xué)計算機學(xué)院
曹計昌8/6/20231華中科技大學(xué)計算機學(xué)院C語言程序設(shè)計TheCProgrammingLangu第6章編譯預(yù)處理
編譯預(yù)處理:對源程序進行編譯之前所作的工作,它由預(yù)處理程序負責完成。編譯時,系統(tǒng)將自動引用預(yù)處理程序?qū)υ闯绦蛑械念A(yù)處理指令進行處理。程序員通過編譯預(yù)處理命令規(guī)定編譯器在編譯前所作的工作。預(yù)處理指令:以“#”號開始的指令。編譯obj源程序預(yù)處理源程序連接exe8/6/20232華中科技大學(xué)計算機學(xué)院第6章編譯預(yù)處理編譯預(yù)處理:對源程序進行編譯之前所6.1文件包含#include功能:用指定文件的內(nèi)容取代該預(yù)處理指令行,有2種形式:(1)#include<文件名>在指定的標準目錄下尋找被包含文件(2)#include"文件名"首先在用戶當前目錄中尋找被包含文件,若找不到,再在指定的標準目錄下尋找如:#include“stdio.h”#include“math.h”
8/6/20233華中科技大學(xué)計算機學(xué)院6.1文件包含#include功能:用指定文件的內(nèi)6.2宏定義#define功能:用一個標識符來表示一個字符串.一般形式為:#define標識符字符串宏名:被定義的標識符。宏代換(宏展開):在編譯預(yù)處理時,用字符串去取代宏名預(yù)處理前#defineM(y*y+3*y)voidmain(void){ints,y;printf("Inputanumber:");scanf("%d",&y);s=3*M+4*M+y*M;printf("s=%d\n",s);}預(yù)處理后voidmain(void){ints,y;printf("Inputanumber:");scanf("%d",&y);s=3*(y*y+3*y)+4*(y*y+3*y)
+y*(y*y+3*y);printf("s=%d\n",s);}8/6/20234華中科技大學(xué)計算機學(xué)院6.2宏定義#define功能:用一個標識符來表示一個6.3帶參數(shù)的宏定義#define標識符(標識符,標識符,…,標識符)字符串宏名形式參數(shù)宏調(diào)用:給出實參宏展開:(1)用字符串替換宏,(2)用實參去替換形參8/6/20235華中科技大學(xué)計算機學(xué)院6.3帶參數(shù)的宏定義#define標識符(標識符,例定義計算x2的宏#defineSQ(x)((x)*(x))X:形式參數(shù)宏調(diào)用:SQ(a+1)/*a+1為實參*/宏展開:((a+1)*(a+1)) 實際上是用((x)*(x))代替SQ(x),用實參a+1代替形參X。宏調(diào)用:SQ(SQ(a))宏展開:((((a)*(a)))*(((a)*(a))))8/6/20236華中科技大學(xué)計算機學(xué)院例定義計算x2的宏#define為什么要這么多的括號?
考慮:#defineSQ(x)x*x宏調(diào)用:SQ(a+b)宏展開:a+b*a+b/*與(a+b)*(a+b)不同*/再考慮:#defineSQ(x)(x)*(x)宏調(diào)用:27/SQ(3)宏展開:27/(3)*(3)
/*值27,與27/32不同*/定義帶參數(shù)的宏時,為了保證計算次序的正確性,表達式中的每個參數(shù)用括號括起來,整個表達式也用括號括起來。8/6/20237華中科技大學(xué)計算機學(xué)院為什么要這么多的括號?考慮:#defineSQ(x)注意:宏名和與左括號之間不能有空格
#defineSQ
(x)((x)*(x))被認為是無參宏定義。宏調(diào)用:SQ(3)宏展開:(x)((x)*(x))(3)/*顯然錯誤的*/8/6/20238華中科技大學(xué)計算機學(xué)院注意:宏名和與左括號之間不能有空格#defineSQ帶參的宏雖被認為不安全,但還是很有價值#defineSQ(x)((x)*(x))宏調(diào)用:SQ(++a)宏展開:((++a)*(++a))/*a加2次如是函數(shù)調(diào)用,將不會有問題*/宏節(jié)省了函數(shù)調(diào)用的開銷,程序運行速度更快,形式參數(shù)不分配內(nèi)存單元,不必作類型說明。但是,宏展開后使源程序增長。宏比較適合于經(jīng)常使用的簡短表達式,以及小的可重復(fù)的代碼段;當任務(wù)比較復(fù)雜,需要多行代碼才能實現(xiàn)時,或者要求程序越小越好時,就應(yīng)該使用函數(shù)。8/6/20239華中科技大學(xué)計算機學(xué)院帶參的宏雖被認為不安全,但還是很有價值#6.4取消宏定義#undef終止宏名的作用域,其形式為:#undef標識符何時使用#undef指令?防止宏名的沖突#include"everything.h"#undefSIZE/*everything.h中定義了SIZE,就取消它;否則該指令不起作用*/#defineSIZE100保證調(diào)用的是一個實際函數(shù)而不是宏#undefgetcharintgetchar(void){…}8/6/202310華中科技大學(xué)計算機學(xué)院6.4取消宏定義#undef終止宏名的作用域,其形式為:6.5條件編譯條件編譯:在預(yù)處理中進行條件控制,根據(jù)所求條件的值有選擇地包含不同的程序部分,因而產(chǎn)生不同的目標代碼。這對于程序的移植和調(diào)試是很有用的。條件編譯指令三種形式,控制流與if-else語句類似。見p172表6.18/6/202311華中科技大學(xué)計算機學(xué)院6.5條件編譯條件編譯:在預(yù)處理中進行條件控制,根據(jù)所求例利用R計算圓或正方形的面積預(yù)處理前#defineR/*#undefR*/voidmain(void){floatc,r,s;printf("inputanumber:");scanf("%f",&c);#ifdefRr=3.14159*c*c;printf("usedefine:%f\n",r);#elses=c*c;printf("useundef%f\n",s);#endif}預(yù)處理后voidmain(void){
floatc,r,s;
printf(“inputanumber:”);
scanf(“%f”,&c);
r=3.14159*c*c;
printf(“%f\n”,r);}生成的目標程序較短
8/6/202312華中科技大學(xué)計算機學(xué)院例利用R計算圓或正方形的面積6.6assert宏在頭文件assert.h中,用來測試表達式的值是否符合要求,其形式如下:
assert(condition)如果condition值非0,程序繼續(xù)執(zhí)行下一個語句。如果condition值0,就輸出錯誤信息,并通過調(diào)用實用庫中的函數(shù)abort終止程序的執(zhí)行。8/6/202313華中科技大學(xué)計算機學(xué)院6.6assert宏在頭文件assert.h中,用assert宏舉例assert(x<=10);如果x大于10,就會輸出如下包含行號和文件名的錯誤信息并中斷執(zhí)行:Assertionfailed:x<=0,filetest.c,line12對于大多數(shù)編譯器來說,在頭文件assert.h的assert宏定義中,如果定義了符號常量NDEBUG,其后的assert將被忽略。因此,如果不再需要assert,那么可把代碼行#defineNDE
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒精燈智能故障診斷-深度研究
- 能源交易市場機制-深度研究
- 法律民俗與倫理道德-深度研究
- 隧道施工風險評估模型構(gòu)建-深度研究
- TY/T 3501.5-2024高山滑雪板性能測定第5部分:彎曲振動
- 科技戰(zhàn)略課題申報書模板
- 書法課題申報書怎么寫
- 省級課題 申報書
- 課題申報書錯誤
- 內(nèi)部采購合同范本
- 教育機構(gòu)招生合作協(xié)議
- 我的寒假生活課件模板
- ISO37000-2021組織治理-指南(雷澤佳譯2022)
- c語言期末機考(大連理工大學(xué)題庫)
- 洞頂回填技術(shù)交底
- 貝多芬與《月光奏鳴曲》
- 《汽車理論》復(fù)習提綱
- 利用勾股定理作圖計算(課堂PPT)
- 第18課 罐和壺(一)
- 初二下分式混合計算練習1(附答案)
- 交通建設(shè)工程工程量清單計價規(guī)范(第1部分公路工程)-解析
評論
0/150
提交評論