第8章 編譯預(yù)處理_第1頁(yè)
第8章 編譯預(yù)處理_第2頁(yè)
第8章 編譯預(yù)處理_第3頁(yè)
第8章 編譯預(yù)處理_第4頁(yè)
第8章 編譯預(yù)處理_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

八、編譯預(yù)處理

宏定義

2文件包含命令3小型案例5

任務(wù)71條件編譯4任務(wù)分析1求解某校園圓形花壇的圓周長(zhǎng)及圓面積要解決這類問(wèn)題,首先為所需使用的常量確定好便于記憶和理解的符號(hào)標(biāo)識(shí),以便構(gòu)造程序和整理程序文本,從而也方便程序的修改和移值,接下來(lái)按程序功能編碼。程序中運(yùn)用圓周長(zhǎng)計(jì)算公式及圓面積計(jì)算公式進(jìn)行計(jì)算,公式書(shū)寫符合C語(yǔ)言語(yǔ)句形式即可。返回首頁(yè)任務(wù)分析1要解決這類問(wèn)題,首先為所需使用的常量確定好便于記憶和理解的符號(hào)標(biāo)識(shí),以便構(gòu)造程序和整理程序文本,從而也方便程序的修改和移值,接下來(lái)按程序功能編碼。程序中運(yùn)用圓周長(zhǎng)計(jì)算公式及圓面積計(jì)算公式進(jìn)行計(jì)算,公式書(shū)寫符合C語(yǔ)言語(yǔ)句形式即可。數(shù)據(jù)需求問(wèn)題輸入r/*表示圓的半徑*/問(wèn)題輸出circ/*存放圓的周長(zhǎng)*/area/*存放圓的面積*/返回首頁(yè)任務(wù)分析1求解圓周長(zhǎng)及面積的程序*/#include<stdio.h>/*預(yù)處理,頭文件對(duì)printf,scanf函數(shù)的聲明*/#definePI3.14159/*定義符號(hào)常量PI*/doublecirc(r)doubler;{return(2.0*PI*r);}doublearea(r)返回首頁(yè)任務(wù)分析1doubler;{return(PI*r*r);}main(){doubler;/*定義雙精度型變量r*/printf(“請(qǐng)輸入待求圓半徑:”);/*輸入圓的半徑*/scanf(“%lf\n”,r);printf(“所求圓的周長(zhǎng)%.4f=circ\n”,circ(r));/*所求圓的周長(zhǎng)*/printf(“所求圓的面積%.4f=area\n”,area(r));/*所求圓的面積*/}運(yùn)行結(jié)果:請(qǐng)輸入待求圓半徑:1.0所求圓的周長(zhǎng)=6.2832所求圓的面積=3.1416返回首頁(yè)宏定義1

宏定義是編譯預(yù)處理內(nèi)容之一,C語(yǔ)言的宏定義分為兩種形式,即帶參數(shù)的宏定義和不帶參數(shù)的宏定義兩種形式。返回首頁(yè)無(wú)參宏定義1無(wú)參宏是用一個(gè)簡(jiǎn)單的名字代替一長(zhǎng)的字符串,一般定義格式為:#define符號(hào)常量名字符串其中符號(hào)常量名稱為宏名,習(xí)慣上用大寫字母表示,常量名與所對(duì)應(yīng)的字符串間用空格符隔開(kāi),在程序中,凡出現(xiàn)符號(hào)常量名的地方,經(jīng)編譯預(yù)處理后就都被替換為它所對(duì)應(yīng)的字符串,即所謂的宏展開(kāi)。

行尾無(wú)需符號(hào)無(wú)參宏定義1例8.1無(wú)參宏應(yīng)用舉例#include<stdio.h>#defineR3.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*Rmain(){printf(“L=%f\nS=%f\n”,L,S);}程序運(yùn)行結(jié)果為:L=18.849556S=28.274333帶參宏定義1除簡(jiǎn)單的宏定義(即不帶參的宏)外,C語(yǔ)言預(yù)處理還允許帶參數(shù)的宏定義,進(jìn)行預(yù)處理時(shí)不僅對(duì)定義的宏名進(jìn)行替換,而且還進(jìn)行參數(shù)替換,定義的一般格式為:#define宏名(參數(shù)表)字符串其中,字符串中應(yīng)該包含在參數(shù)表中所指定的參數(shù)注意:使用宏定義所帶的實(shí)參可以是常量、已被賦值的變量或表達(dá)式,一個(gè)宏定義所帶參數(shù)可以多于一個(gè),使用帶參宏編程時(shí),應(yīng)注意在宏定義中宏名和左括號(hào)間沒(méi)有空格,另外帶參宏還允許宏定義嵌套。返回首頁(yè)返回節(jié)首2

帶參宏定義例8.2帶參宏應(yīng)用舉例#include<stdio.h>#definePI3.1415926#defineCIRCLE(R,V)V=4.0/3.0*PI*R*Rmain(){floatr,v;scanf(“%f”,&r);CIRCLE(r,v);printf(“r=%6.2f,v=%6.2f\n”,r,v);}程序運(yùn)行結(jié)果為:3.5r=3.50,v=179.59返回首頁(yè)2

宏命令#undef用于終止宏定義的作用域,一般形式為:#undefine宏名例如:#defineG9.8main(){…../*G的有效范圍是從定義開(kāi)始到#undefG止*/}#undefGf1(){……}分析:由于在函數(shù)f1()之前終止了宏名G的作用,故G不再在f1()中起作用,#undef也可用于函數(shù)內(nèi)部。終止宏定義2

所謂文件包含預(yù)處理是指在一個(gè)文件中將另外一個(gè)文件的全部?jī)?nèi)容包含進(jìn)來(lái)的處理過(guò)程,即將另外的文件包含到本文件中。C語(yǔ)言編譯預(yù)處理命令#include實(shí)現(xiàn)包含操作,一般形式為:#include<文件名>或#include“文件名”其中,文件名是指要包含進(jìn)來(lái)的文本文件的名稱,也稱為頭文件或編譯預(yù)處理文件。

文件包含命令2

例如,在file1.c文件中有如下內(nèi)容:inta,b,c;floatx,y,z;charm,n,p;file2.c文件內(nèi)容如下:#include“file1.c”main(){……}則對(duì)file2.c文件進(jìn)行編譯處理時(shí),在編譯處理階段將對(duì)其中的#include命令進(jìn)行”文件包含”處理,將file1.c文件中的全部?jī)?nèi)容插入到file2.c文件中的#include“file1.c”預(yù)處理語(yǔ)句處,也即是將file1.c文件中的內(nèi)容包含到file2.c文件中,經(jīng)編譯預(yù)處理后,file2.c文件的內(nèi)容為:inta,b,c;floatx,y,z;charm,n,p;main(){……}文件包含命令2

不同的庫(kù)函數(shù)其功能是不一樣的,以下是C語(yǔ)言中常用的標(biāo)準(zhǔn)頭文件

文件包含命令表8.1C語(yǔ)言中的常用標(biāo)準(zhǔn)頭文件2

一般情況源程序中所有的行都參加編譯,但有時(shí)希望對(duì)其中一部分內(nèi)容只有在滿足一定條件下才進(jìn)行編譯,也即是對(duì)一部分內(nèi)容指定編譯條件,這就是“條件編譯”。適當(dāng)使用條件編譯將有助于程序的調(diào)試和移值。條件編譯分如下幾種形式:條件編譯2

1.帶#if、#else和#endif標(biāo)識(shí)的定義的一般形式為:#ifdef表達(dá)式程序段1#else表達(dá)式程序段2#endif其功能是當(dāng)表達(dá)式值為真時(shí),則執(zhí)行程序段1;否則執(zhí)行程序段2,其表達(dá)式必須是不整型常量表達(dá)式。2.帶#ifdef標(biāo)識(shí)的定義的一般形式為:#ifdef宏名程序段1#else條件編譯2

程序段2#endif其功能是用來(lái)測(cè)試一個(gè)宏名是否被定義,若宏名被定義則編譯程序段1;否則編譯程序段2。3.帶#ifndef標(biāo)識(shí)的定義的一般形式為:#ifndef宏名程序段1#else程序段2#endif其功能是用來(lái)測(cè)試一個(gè)宏名是否曾被定義,若宏名未被定義則編譯程序段1;否則編譯程序段2。條件編譯2

例8.3從鍵盤輸入10個(gè)整數(shù),并依所設(shè)置的編譯條件將其中的最大值或最小值顯示出來(lái)。#include<stdio.h>#defineMFLAG1mai(){inti,M;intarray[10];for(i=0;i<10;i++)scanf(“%d”,&array[i]);/*鍵盤輸入整數(shù)到數(shù)組array中*/M=array[0];/*將數(shù)組中第一個(gè)元素賦給M*/for(i=1;i<10;i++) {#ifMFLAG/*根據(jù)條件編譯完成不同條件下的編譯操作*/條件編譯2

/*當(dāng)M為1時(shí),/求10個(gè)數(shù)中的最大者,否則求最小者*/if(M<array[i])M=array[i];#elseif(M>array[i])M=array[i];#endif}printf(“M=%d”,M);}條件編譯2

提出問(wèn)題:對(duì)字符的操作,有時(shí)需要將字符的大小寫進(jìn)行切換,比如輸入一組字符將它轉(zhuǎn)換為大寫形式輸出或是以小寫形式輸出等,本例程中就是要求任意輸入一行字母字符,根據(jù)需要設(shè)條件編譯,使之能將字母全改為大寫輸出或小寫輸出。小型案例2

分析問(wèn)題:可先設(shè)定一個(gè)常量,作為后續(xù)進(jìn)行預(yù)處理的條件編譯命令的條件選項(xiàng),依不同的條件作相應(yīng)的條件編譯。數(shù)據(jù)需求問(wèn)題輸入LETTER/*作為存放字母字符的常量標(biāo)識(shí)*/str[]/*一個(gè)字符串?dāng)?shù)組*/問(wèn)題輸出轉(zhuǎn)換后的字母符號(hào)相關(guān)計(jì)算公式小寫字母-32==大寫字母小型案例2

求解問(wèn)題:算法如下1.讀取字符串?dāng)?shù)組的各個(gè)字符2.依LETTER標(biāo)識(shí)條件,作相應(yīng)的轉(zhuǎn)換3.用小寫字母與大寫字母間的差值為32進(jìn)行計(jì)算轉(zhuǎn)換小型案例2

程序?qū)崿F(xiàn):字符的大小寫轉(zhuǎn)換程序*/#defineLETTER1main(){charstr[20]=“Clanguage”,c;inti;

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論