版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章預(yù)處理命令制作人:王敬華第10章:預(yù)處理命令
學(xué)習(xí)的意義
語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令CC語(yǔ)言的一個(gè)重要特征是它的預(yù)處理功能。我們知道,一個(gè)高級(jí)語(yǔ)言源程序在計(jì)算機(jī)上運(yùn)行,必須先用編譯程序?qū)⑵浞g為機(jī)器語(yǔ)言。編譯包括詞法分析、語(yǔ)法分析、代碼生成、代碼優(yōu)化等步驟,有時(shí)在編譯之前還要做某些預(yù)處理工作,如去掉注釋,變換格式等。C語(yǔ)言允許在源程序中包含預(yù)處理命令,在正式編譯之前(詞法分析之前)系統(tǒng)先對(duì)這些命令進(jìn)行“預(yù)處理”,然后整個(gè)源程序再進(jìn)行通常的編譯處理。從語(yǔ)法上講,這些預(yù)處理命令不是C語(yǔ)言的一部分,但使用它們卻擴(kuò)展了C語(yǔ)言程序設(shè)計(jì)的環(huán)境,可以簡(jiǎn)化程序開(kāi)發(fā)過(guò)程,提高程序的可讀性,也更有利于移植和調(diào)試C語(yǔ)言程序。本章主要介紹宏定義、文件包括和條件編譯等預(yù)處理命令。學(xué)習(xí)的意義
源程序生成執(zhí)行文件的過(guò)程:C語(yǔ)言源程序.c或.cpp編譯目標(biāo)程序.obj鏈接執(zhí)行程序.exe#include<stdio.h>#definePI3.14159voidmain(){floatr=4;printf(“s=%f\n”,PI*r*r);}預(yù)處理命令預(yù)處理本章討論之重點(diǎn)!語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C學(xué)習(xí)目標(biāo)
學(xué)習(xí)內(nèi)容
預(yù)處理命令簡(jiǎn)介宏定義不帶參數(shù)的宏定義帶參數(shù)的宏定義文件包括條件編譯本章小結(jié)掌握#include、#define、#if、#ifdef、#else、#ifndef和
#endif等命令的用法;掌握宏定義和宏替換的一般方法;掌握包含文件的處理方法;了解條件編譯的作用和實(shí)現(xiàn)方法。語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C10.1預(yù)處理命令簡(jiǎn)介
預(yù)處理命令:C源程序中以#開(kāi)頭、以換行符結(jié)尾的行
種類:宏定義#define、#undef
文件包含#include
條件編譯#if、#ifdef、#else、#elif、#endif等其他
#line、#error、#program等本章主要討論的內(nèi)容!格式:“#”開(kāi)頭占單獨(dú)書寫行語(yǔ)句尾不加分號(hào)語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C10.2宏定義
宏定義分為兩種:不帶參數(shù)的宏定義和帶參數(shù)的宏定義。
1、不帶參數(shù)的宏定義一般形式
#define標(biāo)識(shí)符單詞串指令名稱宏名,被定義代表后面的單詞串
宏體,是宏的內(nèi)容文本
可缺省,表示宏名定義過(guò)或取消宏體功能
用指定標(biāo)識(shí)符(宏名)代替字符序列(宏體)如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);#defineSIZE10#defineINT_STR
"%d"voidmain()
{inta[SIZE],i;for(i=0;i<SIZE;i++)scanf(INT_STR,&a[i]);for(i=SIZE-1;i>=0;i--)printf(INT_STR,a[i]);}宏定義voidmain()
{inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=10-1;i>=0;i--)printf("%d",a[i]);}預(yù)編譯處理后
注意:宏替換時(shí)僅僅是將源程序中與宏名相同的標(biāo)識(shí)符替換成宏的內(nèi)容文本,并不對(duì)宏的內(nèi)容文本做任何處理。語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C宏定義注意事項(xiàng)
C程序員通常用大寫字母來(lái)定義宏名,以便與變量名區(qū)別。
如:#definePI3.14159宏定義的位置任意,但一般放在函數(shù)外面。
宏定義時(shí),如果單詞串太長(zhǎng),需要寫多行,可以在行尾使用反斜線“\”續(xù)行符例如:#defineLONG_STRING"thisisaverylongstringthatis\usedasanexample"宏名的作用域是從#define定義之后直到該宏定義所在文件結(jié)束
#undef可終止宏名作用域#undef標(biāo)識(shí)符#defineYES1voidmain(){……..}#undefYES#defineYES0voidmax(){……..}YES原作用域YES新作用域
宏定義可以嵌套定義,但不能遞歸定義
#defineR2.0#definePI3.14159#defineL2*PI*R(√)#defineSPI*R*R(√)#defineMM+10(×)程序中字符串常量即雙引號(hào)中的字符,不作為宏進(jìn)行宏替換操作
#defineXYZthisisatestprintf("XYZ");輸出:XYZ,而不是:thisisatest。語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C宏定義注意事項(xiàng)
宏定義一般以換行結(jié)束,不要用分號(hào)結(jié)束,以免引起不必要的錯(cuò)誤#definePI3.14;
a=PI*2*2;
預(yù)編譯處理后a=3.14;*2*2;
錯(cuò)誤!宏可以被重復(fù)定義。
#defineN10
//第一次宏定義intf(){N的內(nèi)容是10return(N*N);}#defineN20
//第二次宏定義voidmain(){N的內(nèi)容是20printf("%d\n",N+f());}在定義宏時(shí),如果宏是一個(gè)表達(dá)式,那么一定要將這個(gè)表達(dá)式用()括起來(lái),否則可能會(huì)引起非預(yù)期的結(jié)果。
#defineNUM110#defineNUM220#defineNUMNUM1+NUM2voidmain()
{inta=2,b=3;a*=NUM;b=b*NUM;printf("a=%d,b=%d\n",a,b);}voidmain()
{inta=2,b=3;a*=10+20;b=b*10+20;printf("a=%d,b=%d\n",a,b);}預(yù)編譯處理后輸出結(jié)果:a=60,b=50
()()()輸出結(jié)果:a=60,b=90
語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C2、帶參數(shù)的宏定義一般形式
#define標(biāo)識(shí)符(參數(shù)列表)單詞串參數(shù)表由一個(gè)或多個(gè)參數(shù)構(gòu)成,參數(shù)只有參數(shù)名,沒(méi)有數(shù)據(jù)類型符,參數(shù)之間用逗號(hào)隔開(kāi),參數(shù)名必須是合法的標(biāo)識(shí)符通常會(huì)引用宏的參數(shù)
例:#defineS(a,b)a*b………..area=S(3,2);宏展開(kāi):area=3*2;宏展開(kāi):形參用實(shí)參換,其它字符保留宏體及各形參外一般應(yīng)加括號(hào)()不能加空格例#defineS(r)PI*r*r相當(dāng)于定義了不帶參宏S,代表字符串“(r)PI*r*r”
例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展開(kāi):z=x+y*x+y;一般寫成:#definePOWER(x)((x)*(x))宏展開(kāi):z=((x+y)*(x+y));語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C#defineMAX(x,y)(x)>(y)?(x):(y)…….voidmain(){inta,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展開(kāi):t=(a+b)>(c+d)?(a+b):(c+d);intmax(intx,inty){return(x>y?x:y);}voidmain(){inta,b,c,d,t;…….t=max(a+b,c+d);………}【例】用宏定義和函數(shù)實(shí)現(xiàn)同樣的功能語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C帶參的宏與函數(shù)區(qū)別帶參宏函數(shù)處理時(shí)間編譯時(shí)程序運(yùn)行時(shí)參數(shù)類型無(wú)類型問(wèn)題定義實(shí)參、形參類型處理過(guò)程不分配內(nèi)存,簡(jiǎn)單的字符置換分配內(nèi)存,先求實(shí)參值,再代入形參程序長(zhǎng)度變長(zhǎng)不變運(yùn)行速度不占運(yùn)行時(shí)間調(diào)用和返回占時(shí)間語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C10.3文件包含處理過(guò)程功能一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來(lái)一般形式#define<包含文件名>或#define“包含文件名”預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯<>:直接到系統(tǒng)指定的“文件包含目錄”去查找被包含的文件“”:系統(tǒng)首先到當(dāng)前目錄下查找被包含文件,如果沒(méi)找到,再到系統(tǒng)指定的“文件包含目錄”去查找。
預(yù)編譯處理后A源文件prg1.cpp#include"prg1.cpp"
B源文件prg2.cppBA新源文件prg2.cpp語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C文件包含舉例:#include"head.h"
#include"func.cpp"
voidmain(){inta,b,c;a=getnum();b=getnum();c=max(max(a,b),NUM);printf("MAX=%d\n",c);}(stdio.h文件中的內(nèi)容)
#defineNUM10intmax(intx,inty){return(x>y?x:y);}intgetnum(){inta;scanf("%d",&a)return(a);}voidmain(){inta,b,c;a=getnum();b=getnum();c=max(max(a,b),NUM);printf("MAX=%d\n",c);}#include<stdio.h>#defineNUM10intmax(intx,inty){return(x>y?x:y);}intgetnum(){inta;scanf("%d",&a)return(a);}預(yù)編譯處理后語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C文件包含的優(yōu)點(diǎn):
一個(gè)大程序,通常分為多個(gè)模塊,并由多個(gè)程序員分別編程。有了文件包含處理功能,就可以將多個(gè)模塊共用的數(shù)據(jù)(如符號(hào)常量和數(shù)據(jù)結(jié)構(gòu))或函數(shù),集中到一個(gè)單獨(dú)的文件中(如上例中的文件head.h和func.cpp)。這樣,凡是要使用其中數(shù)據(jù)或調(diào)用其中函數(shù)的程序員,只要使用文件包含處理功能,將所需文件包含進(jìn)來(lái)即可,不必再重復(fù)定義它們,從而減少重復(fù)勞動(dòng)。文件包含的幾點(diǎn)說(shuō)明
常用在文件頭部的被包含文件,稱為“標(biāo)題文件”或“頭部文件”,常以.h(head)作為后綴,簡(jiǎn)稱頭文件。在頭文件中,除可包含宏定義外,還可包含外部變量定義、結(jié)構(gòu)類型定義等。
一條包含命令,只能指定一個(gè)被包含文件。如果要包含n個(gè)文件,則要用n條包含命令。
文件包含可以嵌套,即被包含文件中又包含另一個(gè)文件。語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C10.4條件編譯根據(jù)一定的條件去編譯源文件的不同部分,這就是條件編譯。1、#if~#endif形式格式:#if條件1程序段1#elif條件2程序段2……#else程序段n#endif常量表達(dá)式。通常會(huì)用到宏名,條件可以不加括號(hào)“()”
#elif和#else可以沒(méi)有
#endif必須存在,它是#if命令的結(jié)尾
如果條件1為真就編譯程序段1,否則如果條件2為真就編譯程序段2,…,如果各條件都不為真就編譯程序段n。作用:
#if和#elif常常與defined命令配合使用,defined命令的格式為:
defined(宏名)或defined宏名功能:判斷某個(gè)宏是否已經(jīng)定義,如果已經(jīng)定義,defined命令返回1,否則返回0。Defined命令只能與#if或#elif配合使用,不能單獨(dú)使用。例如:#ifdefined(USA)的含義是“如果定義了宏USA”。
語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C例:下面的程序利用ACTIVE_COUNTRY定義貨幣的名稱
#defineUSA0#defineENGLAND1#defineFRANCE2#defineACTIVE_COUNTRYUSA
#ifACTIVE_COUNTRY==USA
char*currency=“dollar”;
//有效
#elifACTIVE_COUNTRY==ENGLANDchar*currency="pound"
;#elsechar*currency="france"
;#endifvoidmain(){floatprice1,price2,sumprice;scanf("%f%f",&price1,&price2);sumprice=price1+price2;printf("sum=%.2f%s",sumprice,currency);}char*currency=“dollar”;
voidmain(){floatprice1,price2,sumprice;scanf("%f%f",&price1,&price2);sumprice=price1+price2;printf("sum=%.2f%s",sumprice,currency);}預(yù)編譯處理后語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C2、#ifdef~#endif形式格式:#ifdef宏名程序段1#else程序段2#endif等價(jià)于“#ifdefined(宏名)”
在#ifdef和#else之間可以加多個(gè)#elif命令如果宏名已被#define行定義,則編譯程序段1,否則編譯程序段2
作用:#defineINTEGER#ifdefINTEGER
intadd(intx,inty)//有效
{return(x+y);}#elsefloatadd(floatx,floaty){return(x+y);}#endifvoidmain(){#ifdefINTEGER
inta,b,c;//有效
scanf("%d%d",a,b);printf("a+b=%d\n",add(a,b));#elsefloata,b,c;scanf("%f%f",a,b);printf("a+b=%f\n",add(a,b));#endif}intadd(intx,inty)//有效
{return(x+y);}voidmain(){inta,b,c;//有效
scanf("%d%d",a,b);printf("a+b=%d\n",add(a,b));}預(yù)編譯處理后語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C3、#ifndef~#endif形式格式:#ifndef宏名程序段1#else程序段2#endif如果宏名沒(méi)被#define行定義,則編譯程序段1,否則編譯程序段2
作用:條件編譯與分支語(yǔ)句二者之間的差別:條件編譯是在預(yù)編譯時(shí)處理;而條件語(yǔ)句則是在程序運(yùn)行時(shí)處理。條件編譯中的條件不可以包含變量名,只能是常量表達(dá)式(通常包含宏名),可以不加括號(hào);而條件語(yǔ)句中的條件是條件表達(dá)式,可以包含變量或函數(shù)等,并且必須加括號(hào)。例如:#defineN10intNUM=10;#ifNUM==10…#endif
錯(cuò)誤,NUM是變量??筛臑椋?/p>
#ifN==10
語(yǔ)言程序設(shè)計(jì)教程第二版第十章預(yù)處理命令C條件編譯與分支語(yǔ)句二者之間的差別:條件編譯是將滿足編譯條件的程序代碼進(jìn)行編譯生成目標(biāo)代碼,不滿足編譯條件的程序代碼將不進(jìn)行編譯;而分支語(yǔ)句則是不管滿足條件的代碼,還是不滿足條件的代碼,都要編譯生成目標(biāo)代碼(包括分支語(yǔ)句本身),所以如果用條件語(yǔ)句來(lái)代替條件編譯命令,程序的目標(biāo)代碼將變長(zhǎng)
條件編譯命令可以放在所有函數(shù)的外部,也可以放在某函數(shù)的內(nèi)部;但分支語(yǔ)句只能出現(xiàn)在某函數(shù)內(nèi)部。使用條件編譯的源程序使用分支語(yǔ)句的源程序#include<stdio.h>#include<stdio.h>#defineNUM10#defineNUM10voidmain()voidmain(){{程序代碼#ifNUM==10if(NUM==10)printf("NUMis10\n");printf("NUMis10\n");#elseelseprintf("NUMnotis10\n");printf("NUM
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 強(qiáng)化學(xué)習(xí)采樣
- 2025年高考化學(xué)總復(fù)習(xí)分類訓(xùn)練:化學(xué)反應(yīng)速率(解析卷)
- 廣西理論知識(shí)和業(yè)務(wù)規(guī)范考題
- 中建航天高技術(shù)應(yīng)用中心項(xiàng)目觀摩策劃
- 第七屆進(jìn)博會(huì)落下帷幕感悟心得
- 2023年ICU專用末端裝置資金籌措計(jì)劃書
- 強(qiáng)化計(jì)算機(jī)技術(shù)對(duì)機(jī)械教學(xué)的滲透
- 煤礦機(jī)電產(chǎn)品買賣協(xié)議書(32篇)
- 物業(yè)停車場(chǎng)租賃合同范本(32篇)
- 2024-2025學(xué)年河南省高一(上)聯(lián)考數(shù)學(xué)試卷(10月份)(含答案)
- 石料倉(cāng)儲(chǔ)合同范本
- 第1-4單元期中核心素質(zhì)檢測(cè)卷(試題)-2024-2025學(xué)年數(shù)學(xué)三年級(jí)上冊(cè)北師大版
- 變配電運(yùn)維知識(shí)考試題(含參考答案)
- 摩托車維修技術(shù)考核試卷
- 6 我的家庭貢獻(xiàn)與責(zé)任(教學(xué)設(shè)計(jì)) 部編版道德與法治四年級(jí)上冊(cè)
- 2024年浙江省寧波市初二上學(xué)期期中歷史試題及解答參考
- 《珍愛(ài)生命拒絕毒品》主題班會(huì)課件
- 2024年貴州畢節(jié)市委政法委所屬事業(yè)單位考調(diào)6人歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- GB/T 32399-2024信息技術(shù)云計(jì)算參考架構(gòu)
- 臺(tái)球廳員工工作流程
- 2024粵東西粵北地區(qū)教師全員輪訓(xùn)培訓(xùn)心得總結(jié)
評(píng)論
0/150
提交評(píng)論