C語言第9章預處理_第1頁
C語言第9章預處理_第2頁
C語言第9章預處理_第3頁
C語言第9章預處理_第4頁
C語言第9章預處理_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第九章預處理命令宏定義#define“文件包含”處理#include條件編譯#if--#else--#endif等本章內(nèi)容2

不帶參數(shù)宏定義一般形式:#define宏名[宏體]功能:用指定標識符(宏名)代替字符序列(宏體)定義位置:任意(一般在函數(shù)外面)作用域:從定義命令到文件結(jié)束

#undef可終止宏名作用域

格式:

#undef宏名1.宏定義宏體可缺省,表示宏名定義過或取消宏體如#defineQQx+y-2#definePI3.1415926#defineOUTprintf(“Hello,World”);例#definePI3.14main(){……..}#undefPI#definePI6.28max(){……..}PI原作用域PI新作用域3

不帶參數(shù)宏定義宏展開:預編譯時,用宏體替換宏名---不作語法檢查宏定義中使用必要的括號()宏定義可嵌套,不能遞歸1.宏定義4

例#defineYES1 if(x==YES)printf(“correct!\n”);展開后:if(x==1)printf(“correct!\n”);例#defineWIDTH80#defineLENGTHWIDTH+40var=LENGTH*2;宏展開:var=80+40*2;()()例#definePI3.1415926#defineSPI*y*yprintf(“%f”,S);宏展開:S=3.1415926*y*y;【例1】讀程序?qū)懡Y(jié)果

#defineQQ(x+y-2)main(){intx,y,z;printf("input2number:");scanf("%d,%d",&x,&y);z=3*QQ;printf("z=%d\n",z);}宏定義預處理時展開:z=3*(x+y-2);5

1.宏定義運行情況:輸入:6,8↙輸出:z=36宏名在源程序中若用引號括起來,則預處理程序不對其作宏替換1.宏定義6

【例2】讀程序?qū)懡Y(jié)果#defineR3.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*Rmain(){printf("L=%f\nS=%f\n",L,S);}宏展開?運行結(jié)果是:L=18.849556S=28.274333帶參數(shù)宏定義一般形式:#define宏名(參數(shù)表)宏體宏展開:形參用實參換,其它字符保留宏體及各形參外一般應加括號()1.宏定義7

不能加空格例#defineM(y)y*y+3*y………..k=M(5);宏展開:k=5*5+3*5;例

#defineS(r)PI*r*r相當于定義了不帶參宏S,代表字符串“(r)PI*r*r”例

#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展開:z=x+y*x+y;一般寫成:#definePOWER(x)((x)*(x))宏展開:

z=((x+y)*(x+y));【例3】

帶參宏定義示例1.宏定義8

#defineMAX(a,b)(a>b)?a:bmain(){intx,y,max;scanf("%d,%d",&x,&y);max=MAX(x,y);printf("max=%d\n",max);}運行情況:輸入:4,7↙輸出:max=7【例4】

用帶參宏實現(xiàn)3個數(shù)中的最大者(學生練習)#defineMAX(a,b)(a>b)?a:bmain(){intx,y,z,max;scanf("%d,%d,%d",&x,&y,&z);max=MAX((MAX(x,y)),z);printf("max=%d\n",max);}【例5】

【例6】宏定義和函數(shù)功能的比較1.宏定義9

運行情況:1491625#defineKK(y)((y)*(y))main(){intt,i=1;while(i<=5){t=KK(i++);printf("%d",t);}}intKK(inty){return((y)*(y));}main(){inti=1;while(i<=5)printf("%d",KK(i++));}運行情況:1925帶參的宏與函數(shù)區(qū)別10

1.宏定義帶參宏函數(shù)處理過程不分配內(nèi)存簡單的字符置換分配內(nèi)存先求實參值,再代入形參處理時間編譯時程序運行時參數(shù)類型無類型問題定義實參,形參類型程序長度變長不變運行速度不占運行時間調(diào)用和返回占時間功能:一個源文件可將另一個源文件的內(nèi)容全部包含進來一般形式:#include“文件名”

或#include<文件名>處理過程:預編譯時,用被包含文件的內(nèi)容取代該預處理命令,再對“包含”后的文件作一個源文件編譯2.“文件包含”處理11

#include“file2.c”file1.cfile2.cfile1.cfile2.cABA被包含文件內(nèi)容源文件(*.c)頭文件(*.h)文件包含可嵌套2.“文件包含”處理12

宏定義數(shù)據(jù)結(jié)構(gòu)定義函數(shù)說明等#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.cBfile1.cAfile3.cfile2.c說明:一個include只能寫一個文件,包含多個文件需多個include當f1.c包含f2.c,而f2.c又包含f3.c時,有兩種形式:只在f1.c中用#include.#include"f2.c“#include"f3.c"分別在f1.c,f2.c中用#include

在f1.c中:#include"f2.c"

在f2.c中:#include"f3.c“

2.“文件包含”處理13

一般用.h擴展名命名被包含文件。h為head之意以與一般.c文件區(qū)別。如系統(tǒng)stdio.h.系統(tǒng).h文件在子目錄INCLUDE下#include后的文件名既可用"

",也可用<>,兩者區(qū)別:""首先在引用文件的目錄中找,然后再去標準目錄中找。可指定路徑<>只在標準目錄中找。被包含文件和包含文件最后形成一個文件。因此,全局變量作用域為整個文件。不必用extern說明。

2.“文件包含”處理14

3.條件編譯15

條件編譯命令的三種形式:

#ifdef~#endif一般格式#ifdef標識符程序段1;

[#else

程序段2;]

#endif功能:當“標識符”已經(jīng)被#define命令定義過,則編譯程序段1,否則編譯程序段2。程序段即可為語句組,也可為命令行#else后面部分可沒有,但#endif保留例:為了調(diào)試程序,加上以下條件編譯

#ifdefDEBUGprintf("x=%d,y=%d,z=%d",x,y,z);#endif調(diào)試完成后只需將這個#define命令行刪去即可只要在此之前有:#defineDEBUG––任意字符則編譯printf()3.條件編譯16

#ifndef~#endif格式與#ifdef~#endif命令一樣,功能正好與之相反。一般格式#ifndef標識符程序段1;

[#else

程序段2;]

#endif功能:當“標識符”未被#define命令定義過,則編譯程序段1,否則編譯程序段2。3.條件編譯17

#if~#endif一般格式#if常量表達式程序段1;

[#else

程序段2;]

#endif功能:當表達式為非0(“邏輯真”)時,編譯程序段1,否則編譯程序段2。

3.條件編譯18

【例7】分別求圓和正方形的面積#defineR1main(){floatc,r,s;scanf("%f",&c);#ifRr=3.14159*c*c;printf("areaofroundis:%f\n",r);#elses=c*c;printf("areaofsquareis:%f\n",s);#endif}運行情況:輸入:2.4↙

輸出:areaofroundis:18.0955603.條件編譯19

【例8】輸入一行字母字符,根據(jù)需要設置條件編譯,使之能將字母全改為大寫輸出,或全改為小寫字母輸出。#defineLETTER1main(){charstr[20]="CLanguage",c;inti=0;while((c=str[i])!='\0'){i++;#ifLETTERif(c>='a'&&c<='z')c=c-32;#else if(c>='A'&&c<='Z')c+=32;#endif printf("%c",c);}}運行情況:CLANGUAGE小測驗【題1】設有以下宏定義

#defineN3#defineY(n)((N+1)*n)

則執(zhí)行語句“z=2*(N+Y(5+1));”后,z的值為:

A)出錯

B)

42C)48

D)

54【題2】以下程序的輸出結(jié)果是:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論