基礎(chǔ)預(yù)習(xí)預(yù)處理指令宏定義_第1頁(yè)
基礎(chǔ)預(yù)習(xí)預(yù)處理指令宏定義_第2頁(yè)
基礎(chǔ)預(yù)習(xí)預(yù)處理指令宏定義_第3頁(yè)
基礎(chǔ)預(yù)習(xí)預(yù)處理指令宏定義_第4頁(yè)
基礎(chǔ)預(yù)習(xí)預(yù)處理指令宏定義_第5頁(yè)
已閱讀5頁(yè),還剩16頁(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ù)處理指令講師:李南江預(yù)處理指令簡(jiǎn)介C語(yǔ)言在對(duì)源程序進(jìn)行編譯之前,會(huì)先對(duì)一些特殊的預(yù)處理指令作解釋(比如之前使用的#include文件包含指令),產(chǎn)生一個(gè)新的源程序(這個(gè)過(guò)程稱為編譯預(yù)處理),之后再進(jìn)行通常的編譯為了區(qū)分預(yù)處理指令和一般的C語(yǔ)句,所有預(yù)處理指令都以符號(hào)“#”開(kāi)頭,并且結(jié)尾不用分號(hào)預(yù)處理指令可以出現(xiàn)在程序的任何位置,它的作用范圍是從它出現(xiàn)的位置到文件尾。習(xí)慣上我們盡可能將預(yù)處理指令寫在源程序開(kāi)頭,這種情況下,它的作用范圍就是整個(gè)源程序文件C語(yǔ)言提供的預(yù)處理指令主要有:宏定義、文件包含、條件編譯宏定義分類宏定義可以分為2種:不帶參數(shù)的宏定義帶參數(shù)的宏定義一、不帶參數(shù)的宏定義1.一般形式#define宏名

字符串比如

#defineABC10右邊的字符串也可以省略,比如#defineABC2.作用它的作用是在編譯預(yù)處理時(shí),將源程序中所有"宏名"替換成右邊的"字符串",常用來(lái)定義常量。接下來(lái)寫個(gè)程序根據(jù)圓的半徑計(jì)算周長(zhǎng)宏定義#include<stdio.h>

//源程序中所有的宏名PI在編譯預(yù)處理的時(shí)候都會(huì)被3.14所代替#definePI3.14

//根據(jù)圓的半徑計(jì)radius算周長(zhǎng)floatgirth(floatradius){return2*PI*radius;}

intmain(){floatg=girth(2);

printf("周長(zhǎng)為:%f",g);return0;}在第4行定義了一個(gè)叫PI的宏,在編譯預(yù)處理之后,第8行中的2*PI*radius就會(huì)變成2*3.14*radius。3.使用習(xí)慣與注意1>宏名一般用大寫字母,以便與變量名區(qū)別開(kāi)來(lái),但用小寫也沒(méi)有語(yǔ)法錯(cuò)誤2>對(duì)程序中用雙引號(hào)擴(kuò)起來(lái)的字符串內(nèi)的字符,不進(jìn)行宏的替換操作。比如:#defineR10intmain(){char*s="Radio";return0;}在第1行定義了一個(gè)叫R的宏,但是第4行中"Radio"里面的'R'并不會(huì)被替換成103>在編譯預(yù)處理用字符串替換宏名時(shí),不作語(yǔ)法檢查,只是簡(jiǎn)單的字符串替換。只有在編譯的時(shí)候才對(duì)已經(jīng)展開(kāi)宏名的源程序進(jìn)行語(yǔ)法檢查#defineI100intmain(){inti[3]=I;return0;}4>宏名的有效范圍是從定義位置到文件結(jié)束。如果需要終止宏定義的作用域,可以用#undef命令#definePI3.14/*....*/#undefPIPI這個(gè)宏在第1行到第8行之間是有效的,第8行后就無(wú)效了5>定義一個(gè)宏時(shí)可以引用已經(jīng)定義的宏名#defineR3.0#definePI3.14#defineL2*PI*R#defineSPI*R*R帶參數(shù)的宏定義#define宏名(參數(shù)列表)字符串2.作用在編譯預(yù)處理時(shí),將源程序中所有宏名替換成字符串,并且將字符串中的參數(shù)用宏名右邊參數(shù)列表中的參數(shù)替換.#include<stdio.h>

#defineaverage(a,b)(a+b)/2

intmain(){inta=average(10,4);

printf("平均值:%d",a);return0;}第3行中定義了一個(gè)帶有2個(gè)參數(shù)的宏average,第7行其實(shí)會(huì)被替換成:int

a=(10+

4)/2;,輸出結(jié)果為:7是不是感覺(jué)這個(gè)宏有點(diǎn)像函數(shù)呢?3.使用注意1>宏名和參數(shù)列表之間不能有空格,否則空格后面的所有字符串都作為替換的字符串.#defineaverage(a,b)(a+b)/2

intmain(){inta=average(10,4);return0;}注意第1行的宏定義,宏名average跟(a,b)之間是有空格的,于是,第5行就變成了這樣:inta=(a,b)(a+b)/2(10,4);這個(gè)肯定是編譯不通過(guò)的帶參數(shù)的宏在展開(kāi)時(shí),只作簡(jiǎn)單的字符和參數(shù)的替換,不進(jìn)行任何計(jì)算操作。所以在定義宏時(shí),一般用一個(gè)小括號(hào)括住字符串的參數(shù)。下面定義一個(gè)宏D(a),作用是返回a的2倍數(shù)值:如果定義宏的時(shí)候不用小括號(hào)括住參數(shù)#include<stdio.h>

#defineD(a)2*a

intmain(){intb=D(3+4);

printf("%d",b);return0;}第7行將被替換成int

b=2*3+4;,輸出結(jié)果10,如果定義宏的時(shí)候用小括號(hào)括住參數(shù),把上面的第3行改成:#defineD(a)2*(a),注意右邊的a是有括號(hào)的,第7行將被替換成int

b=2*(3+4);,輸出結(jié)果14計(jì)算結(jié)果最好也用括號(hào)括起來(lái)下面定義一個(gè)宏P(guān)(a),作用是返回a的平方:如果不用小括號(hào)括住計(jì)算結(jié)果#include<stdio.h>#definePow(a)(a)*(a)intmain(intargc,constchar*argv[])

{intb=Pow(10)/Pow(2);

printf("%d",b);return0;}注意第3行,沒(méi)有用小括號(hào)擴(kuò)住計(jì)算結(jié)果,只是括住了參數(shù)而已。第6行代碼被替換為:intb=(10)*(10)/(2)*(2);簡(jiǎn)化之后:int

b=10*(10/2)*2;,最后變量b為:100如果用小括號(hào)括住計(jì)算結(jié)果將上面的第3行代碼改為:#definePow(a)((a)*(a))那么第6行被替換為:intb=((10)*(10))/((2)*(2));簡(jiǎn)化之后:int

b=(10*10)/(2*2);,最后輸出結(jié)果:255.與函數(shù)的區(qū)別1.從

溫馨提示

  • 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)論