第10章 預(yù)處理命令(C語言編程)

上傳人:fgh****35 文檔編號(hào):248193600 上傳時(shí)間:2024-10-22 格式:PPT 頁數(shù):21 大?。?04.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
第10章 預(yù)處理命令(C語言編程)_第1頁
第1頁 / 共21頁
第10章 預(yù)處理命令(C語言編程)_第2頁
第2頁 / 共21頁
第10章 預(yù)處理命令(C語言編程)_第3頁
第3頁 / 共21頁

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《第10章 預(yù)處理命令(C語言編程)》由會(huì)員分享,可在線閱讀,更多相關(guān)《第10章 預(yù)處理命令(C語言編程)(21頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,第,10,章 預(yù)處理命令,制作人:王敬華,第,10,章:預(yù)處理命令,學(xué)習(xí)的意義,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,C,語言的一個(gè)重要特征是它的,預(yù)處理功能,。我們知道,一個(gè)高級(jí)語言源程序在計(jì)算機(jī)上運(yùn)行,必須先用編譯程序?qū)⑵浞g為機(jī)器語言。編譯包括詞法分析、語法分析、代碼生成、代碼優(yōu)化等步驟,有時(shí)在編譯之前還要做某些預(yù)處理工作,如去掉注釋,變換格式等。,C,語言允許在源程序中包含預(yù)處理命令,在正式編譯之前(詞法分析之前)系統(tǒng)先對(duì)這些命令進(jìn)行“預(yù)處理”,然后整個(gè)源程序再進(jìn)行通常的編譯處理。從語法上講,這

2、些預(yù)處理命令不是,C,語言的一部分,但使用它們卻擴(kuò)展了,C,語言程序設(shè)計(jì)的環(huán)境,可以簡(jiǎn)化程序開發(fā)過程,提高程序的可讀性,也更有利于移植和調(diào)試,C,語言程序。本章主要介紹,宏定義,、,文件包括,和,條件編譯,等預(yù)處理命令。,學(xué)習(xí)的意義,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,源程序生成執(zhí)行文件的過程:,C,語言源程序,.c,或,.,cpp,編譯,目標(biāo)程序,.,obj,鏈接,執(zhí)行程序,.exe,#include,#define PI 3.14159,void main(),float r=4;,printf,(“s=%,fn,”,PI*r*r);,預(yù)處理命令,預(yù)處理,本章討論之重點(diǎn)!,學(xué)習(xí)目標(biāo),

3、學(xué)習(xí)內(nèi)容,預(yù)處理命令簡(jiǎn)介,宏定義,不帶參數(shù)的宏定義,帶參數(shù)的宏定義,文件包括,條件編譯,本章小結(jié),掌握,#include,、,#define,、,#if,、,#,ifdef,、,#else,、,#,ifndef,和,#,endif,等命令的用法;,掌握宏定義和宏替換的一般方法;,掌握包含文件的處理方法;,了解條件編譯的作用和實(shí)現(xiàn)方法。,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,10.1,預(yù)處理命令簡(jiǎn)介,預(yù)處理命令:,C,源程序中以,#,開頭、以換行符結(jié)尾的行,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,種類:,宏定義,#define,、,#,undef,文件包含,#include,條件編譯,#i

4、f,、,#,ifdef,、,#else,、,#,elif,、,#,endif,等,其他,#line,、,#error,、,#program,等,本章主要討論的內(nèi)容!,格式:,“,#”,開頭,占單獨(dú)書寫行,語句尾不加分號(hào),10.2,宏定義,宏定義分為兩種:,不帶參數(shù)的宏定義,和,帶參數(shù)的宏定義,。,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,1,、不帶參數(shù)的宏定義,一般形式,#define,標(biāo)識(shí)符 單詞串,指令名稱,宏名,被定義代表后面的單詞串,宏體,是宏的內(nèi)容文本,可缺省,表示宏名,定義過或取消宏體,功能,用指定標(biāo)識(shí)符,(,宏名,),代替字符序列,(,宏體,),如,#define YES 1,#

5、define NO 0,#define PI 3.1415926,#define OUT,printf(“Hello,World,”);,#define,SIZE,10,#define,INT_STR,%d,void main(),int,a,SIZE,i;,for(i=0;i=0;i-),printf,(,INT_STR,ai,);,宏定義,void main(),int,a,10,i;,for(i=0;i=0;i-),printf,(,%d,ai,);,預(yù)編譯處理后,注意:,宏替換時(shí)僅僅是將源程序中與宏名相同的標(biāo)識(shí)符替換成宏的內(nèi)容文本,并不對(duì)宏的內(nèi)容文本做任何處理。,語言程序設(shè)計(jì)教程,第十

6、章,預(yù)處理命令,C,宏定義注意事項(xiàng),C,程序員通常用,大寫字母,來定義宏名,以便與變量名區(qū)別。,如:,#define,PI,3.14159,宏定義的,位置任意,,但,一般放在函數(shù)外面,。,宏定義時(shí),如果單詞串太長(zhǎng),需要寫多行,可以在行尾使用反斜線“,”,續(xù)行符,例如:,#define LONG_STRING this is a very long string that is,used as an example,宏名的,作用域,是從,#define,定義之后直到該宏定義所在文件結(jié)束,#,undef,可,終止宏名作用域,#,undef,標(biāo)識(shí)符,#define YES 1,void main()

7、,.,#,undef,YES,#define YES 0,void max(),.,YES,原作用域,YES,新,作用域,宏定義可以,嵌套定義,,但不能遞歸定義,#define R 2.0,#define PI 3.14159,#define L 2*PI*R (,),#define S PI*R*R (,),#define M M+10 (,),程序中字符串常量即雙引號(hào)中的字符,不作為宏進(jìn)行宏替換操作,#define XYZ this is a test,printf(XYZ,);,輸出:,XYZ,,而不是:,this is a test,。,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,宏定義

8、注意事項(xiàng),宏定義一般以,換行結(jié)束,,不要用分號(hào)結(jié)束,以免引起不必要的錯(cuò)誤,#define PI,3.14;,a=PI*2*2;,預(yù)編譯處理后,a=,3.14;,*2*2;,錯(cuò)誤!,宏可以被,重復(fù)定義,。,#define N 10,/,第一次宏定義,int,f(),N,的內(nèi)容是,10,return(N*N);,#define N 20,/,第二次宏定義,void main(),N,的內(nèi)容是,20,printf,(%,dn,N+f();,在定義宏時(shí),如果宏是一個(gè)表達(dá)式,那么一定要將這個(gè)表達(dá)式用()括起來,否則可能會(huì)引起非預(yù)期的結(jié)果。,#define NUM1 10,#define NUM2 20,

9、#define NUM NUM1+NUM2,void main(),int,a=2,b=3;,a*=,NUM,;,b=b*,NUM,;,printf,(a=%d,b=%,dn,a,b);,void main(),int,a=2,b=3;,a*=,10+20,;,b=b*,10+20,;,printf,(a=%d,b=%,dn,a,b);,預(yù)編譯處理后,輸出結(jié)果:,a=60,b=50,(,),(,),(,),輸出結(jié)果:,a=60,b=90,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,2,、帶參數(shù)的宏定義,一般形式,#define,標(biāo)識(shí)符,(,參數(shù)列表,),單詞串,參數(shù)表由一個(gè)或多個(gè)參數(shù)構(gòu)成,參數(shù)只

10、有參數(shù)名,沒有數(shù)據(jù)類型符,參數(shù)之間用逗,號(hào)隔開,參數(shù)名必須是合法的標(biāo)識(shí)符,通常會(huì)引用宏的參數(shù),例:,#define,S(a,b)a*b,.,area=S(3,2);,宏展開:,area=3*2;,宏展開:,形參用實(shí)參換,其它字符保留,宏體及各形參外一般應(yīng)加括號(hào),(),不能加空格,例,#define S,(r)PI*r*r,相當(dāng)于定義了不帶參宏,S,,,代表字符串,“(,r)PI*r*r”,例,#define POWER(x)x*x,x=4;y=6;,z=POWER(x+y);,宏展開:,z=,x+y,*,x+y,;,一般寫成:#,define POWER(x),(,(,x,),*,(,x,),

11、),宏展開:,z=(x+y)*(x+y);,#define,MAX(x,y)(x)(y)?(x):(y),.,void main(),int,a,b,c,d,t;,.,t=,MAX(a+b,c+d,);,宏展開:,t=(a+b)(c+d)?(a+b):(c+d);,int,max(int,x,int,y),return(x,y?x:y);,void main(),int,a,b,c,d,t;,.,t=,max(a+b,c+d,);,【,例,】,用宏定義和函數(shù)實(shí)現(xiàn)同樣的功能,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,帶參的宏與函數(shù)區(qū)別,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,帶參宏,函數(shù),處理

12、時(shí)間,編譯時(shí),程序運(yùn)行時(shí),參數(shù)類型,無類型問題,定義實(shí)參、形參類型,處理過程,不分配內(nèi)存,簡(jiǎn)單的字符置換,分配內(nèi)存,先求實(shí)參值,再代入形參,程序長(zhǎng)度,變長(zhǎng),不變,運(yùn)行速度,不占運(yùn)行時(shí)間,調(diào)用和返回占時(shí)間,10.3,文件包含,處理過程,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,功能,一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來,一般形式,#define ,或,#define “,包含文件名”,預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯,:,直,接到系統(tǒng)指定的“文件包含目錄”去查找被包含的文件,“”,:,系統(tǒng)首先到當(dāng)前目錄下查找被包含文件,如果沒找到,再到系

13、統(tǒng),指定的“文件包含目錄”去查找。,預(yù)編譯處理后,A,源文件,prg1.cpp,#include prg1.cpp,B,源文件,prg2.cpp,B,A,新源文件,prg2.cpp,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,文件包含舉例,:,#include ,head.h,#include ,func.cpp,void main(),int,a,b,c;,a=,getnum,();,b=,getnum,();,c=max(,max(a,b),NUM);,printf,(MAX=%,dn,c);,(,stdio.h,文件中的內(nèi)容),#define NUM 10,int,max(,int,x,i

14、nt,y),return(x y?x:y);,int,getnum,(),int,a;,scanf(%d,&a),return(a);,void main(),int,a,b,c;,a=,getnum,();,b=,getnum,();,c=max(,max(a,b),NUM);,printf,(MAX=%,dn,c);,#include ,#define NUM 10,int,max(,int,x,int,y),return(x y?x:y);,int,getnum,(),int,a;,scanf(%d,&a),return(a);,預(yù)編譯處理后,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,文

15、件包含的優(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)來即可,不必再重復(fù)定義它們,從而減少重復(fù)勞動(dòng)。,文件包含的幾點(diǎn)說明,常用在文件頭部的被包含文件,稱為“標(biāo)題文件”或“頭部文件”,,常以,.h,(,head,)作為后綴,簡(jiǎn)稱頭文件,。在頭文件中,除可包含宏定義外,還可包含外部變量定義、結(jié)構(gòu)類型定義等。,一條包含命令,只能指定一個(gè)

16、被包含文件,。如果要包含,n,個(gè)文件,則要用,n,條包含命令。,文件包含可以嵌套,,即被包含文件中又包含另一個(gè)文件。,10.4,條件編譯,語言程序設(shè)計(jì)教程,第十章,預(yù)處理命令,C,根據(jù)一定的條件去編譯源文件的不同部分,這就是,條件編譯,。,1,、,#if,#,endif,形式,格式:,#if,條件,1,程序段,1,#,elif,條件,2,程序段,2,#else,程序段,n,#,endif,常量表達(dá)式。通常會(huì)用到宏名,條件可以不加括號(hào)“()”,#,elif,和,#else,可以沒有,#,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ú)使用。,例

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!