版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、宏定義宏定義 文件包含文件包含 條件編譯條件編譯 基本內(nèi)容:基本內(nèi)容: 宏定義宏定義: : 是用一個指定的名字來代表一個常量是用一個指定的名字來代表一個常量表達式或字符串,其復(fù)雜形式是帶參數(shù)的表達式或字符串,其復(fù)雜形式是帶參數(shù)的宏。宏。 (1)(1)程序中常用到一些特別的量,如用程序中常用到一些特別的量,如用0 0或或1 1作條件判別作條件判別 量,用量,用-1-1表示文件結(jié)束,用表示文件結(jié)束,用21474836472147483647表示最大表示最大4 4 字節(jié)整數(shù)字節(jié)整數(shù)2 23131-1-1等,它們都常定義成宏名。如:等,它們都常定義成宏名。如: # #define NO 0 defin
2、e NO 0 #define YES 1 #define YES 1 #define EOF (-1) #define EOF (-1) (2) (2)宏名可定義為具有一定精度要求的宏名可定義為具有一定精度要求的floatfloat和和doubledouble類類 型值。如:型值。如: # #define PI 3.14159 define PI 3.14159 #define EPS 1.0e-9 #define EPS 1.0e-9(3)宏名還可以定義為數(shù)組中最后一個元素的地址&aMAX-1。如:#define MAX 100 #define MAXP &aMAX-1(4)利用宏定義還可以
3、把C語言語句的書寫格式寫成程 序員習慣的格式。如: 預(yù)處理后: #define then end #define begin else if(ab) #define end ; begin a:=b; #define := c:=b; d:=(a+b)/2; . D:=(d*c)/2; if(ab)then end else begin c:=b; a:=b; d:=(a+b)/2; d:=(a+b)/2; 利用宏定義將C寫成PASCAL的格式(1)宏名習慣上用大寫字母表示,表示與一般變量名相 區(qū)別。但這并非C語言的規(guī)定,也可以用小寫字母。(2)宏定義不是C語句,不必在行末尾加分號。若加, 則
4、會連分號一些進行置換,可能會出現(xiàn)語法錯誤。 (3)字符串或字符常量中若有與宏名重名的,預(yù)處理程 序一律不將它們作為宏名對待,更不進行代換。 例如: #define YES 1 printf (“YESn”); 輸出的是YES,而不是1。(4)在宏定義中,可以引用已經(jīng)定義的宏名,可以進 行層層代換。例如: #define PI 3.14159 #define R 3.0 #define L 2*PI*R #define S PI*R*R (5)宏定義的有效范圍為定義點到該源文件結(jié)束,還可 以用#undef命令終止宏定義的作用域。例如: #define P 100 main() #undef P
5、f1() l 所謂帶參數(shù)的宏定義是指宏名后帶有形參表的宏定義。 格式:#define 宏名(形參表) 表達式 說明:宏定義中的形參在以后的程序中將以實參替換。置換過程: 在程序中若有帶參數(shù)的宏,則按#define命令行中指定的字符串從左到右進行置換。如果串中包含宏中的形式參數(shù) ,則將程序語句中相應(yīng)的實參(可以是常量、變量或表達式)代替形參,如果宏定義中的字符串中的字符不是參數(shù)字符,則原樣保留。(1)帶參數(shù)的宏定義常用來代替一些簡短的表達式。 例如:#define MIN(x,y) (xy)?x:y) (2)帶參數(shù)的宏定義也可以直接引用已定義過的宏定 義,即實現(xiàn)宏定義的嵌套。 例如:#defin
6、e SQ(x) (x*x) #define FIFTH(x) CUBE(x)*(SQ(x) 預(yù)處理程序?qū)γ總€宏名展開代換,直到件中不再有宏名為止。(3)帶參數(shù)的宏定義可以簡化格式打印函數(shù)printf的格 式,提高程序的可讀性。例如: #define NL putchar(n) #define PR(for,val) printf(val=%fort,val) #define PRINT1(f,x) PR(f,x); NL PRINT1(d,a+b) 其宏展開為: PR(d,a+b);NL 又進一步展開為: printf(a+b=%dt,a+b);putchar(n)(1)在宏展開后容易引起誤解
7、的表達式,在宏定義時, 應(yīng)將表達式用圓括號括起來。 例如:#define S(a,b) a+b 若調(diào)用 v=S(2,3)*4; 時, 經(jīng)宏展開后為:v=2+3*4; 所以,原想先計算2+3,則變成先計算3*4了,故應(yīng)將宏定義中的表達式用圓括號括起來,即成為: #define S(a,b) (a+b) 由此可見,除非有理由不要圓括號,否則,一般都應(yīng)將宏定義中的表達式用圓括號括起來。 在使用帶參數(shù)的宏定義時,要注意的問題:#define MIN(x,y) (x)k=10*x(b)?(a):(b),(a)(b)?(b):(a)l(1)函數(shù)調(diào)用時是先計算實參表達式的值,然后l 將它代入形參。而使用帶參
8、數(shù)的宏時只是進 l 行簡單的字符代換。l(2)函數(shù)調(diào)用是在程序運行中處理的,臨時給它l 分配存儲單元。而宏展開是在編譯時進行的,l 并不給它分配存儲單元,不進行值的傳遞,l 也沒有“返回值”。l(3)函數(shù)的實參、形參都要求定義類型,且二者類型l 必須一致,當不一致時,還要進行類型轉(zhuǎn)換。而l 對宏不存在著類型問題,宏名無類型、參數(shù)無類l 型,都只是一種符號代表,宏展開時只是進行對l 應(yīng)字符的代換。l(4)宏展開會使源程序增長。由于宏展開是在編譯時l 進行的,故只占編譯時間,不占運行時間。而函l 數(shù)調(diào)用不會使源程序變長。函數(shù)調(diào)用占運行時間l (分配單元,保存現(xiàn)場,值傳遞, 返回等)。所l 以,帶參
9、數(shù)的宏定義可以省去在程序中重復(fù)寫相l(xiāng) 同的程序段,同時,在程序中 帶參數(shù)的宏與函l 數(shù)調(diào)用不同,它不必為保存現(xiàn)場入棧、出棧,運l 行速度比函數(shù)調(diào)用快。 文件包含:是指一個程序文件將另一個指定文 件的全部內(nèi)容包含進來。 格式: #include 被包含文件名 或 #include “被包含文件名” 說明: 其中被包含文件名是一個已經(jīng)存在于系 統(tǒng)中的文件的名字。 被包含的文件稱為“標題文件” 或“頭部文 件”,常以“.h”為后綴。注: 文件包含預(yù)處理行可以使用一對尖括號或使用一對雙引號“”將頭部文件名括起來。 尖括號:當用一對尖括號將頭部文件名括起 來時,其意義是指示編譯系統(tǒng)按系 統(tǒng)設(shè)定的標準目錄
10、搜索頭部文件。 雙引號:當用一對雙引號將頭部文件名括起來 時,其意義是指示編譯系統(tǒng)先在源文 件所在的目錄中搜索,若找不到時, 則再按系統(tǒng)設(shè)定的標準搜索。 (1)文件包含預(yù)處理行#include通常放在C程序的開頭,其被包 含的文件內(nèi)容常是一些公用的宏定義或外部變量的說明(注意, 是用extern標識符的說明,不是外部變量的定義),當其出錯, 或因某種原因需要修改其內(nèi)容時,只需修改相應(yīng)的頭部文件 內(nèi)容,而不必修改使用它的程序文件,便于程序的更新維護。 (2)可以節(jié)省程序設(shè)計人員的重復(fù)勞動。當程序員在工作中積累 了許多有價值的宏定義,或者編寫了一些通用、常用的子程 序后,可將其組成若干文件,在編寫
11、新程序時,可用文件包 含將其嵌進來,而不必重復(fù)地寫這些宏定義或子程序。這就 好像使用企業(yè)標準件一樣拿來就用,避免了重復(fù)性勞動,也 減少了因書寫不專心導致出錯的可能性。l 一個#include命令只能指定一個被包l 含的頭部文件,若要包含多個,則應(yīng) l 該使用相應(yīng)多個#include命令。l 文件包含可以嵌套,即被包含文件中l(wèi) 還可以再包含另外的被包含文件。l 頭部文件只能是ASCII 代碼文件,而l 不能是目標代碼文件。l 要調(diào)用標準數(shù)字庫函數(shù)時,必須在文l 件開頭用文件包含命令行。 條件編譯:條件編譯:在編譯C的源文件前,根據(jù)給定的條件 決定編譯的范圍即所謂條件編譯。 說明: 一般情況下,源程序中所有的行都參加編譯。 但有時希望對其中的一部分內(nèi)容只在滿足一 定條件下才進行編譯,即對一部分內(nèi)容指定 編譯條件,當條件滿足時,對一組語句進行 編譯,而當條件不滿足時,則對另一組語句 進行編譯。這就是所謂的“條件編譯”。1.條件編譯命令格式一 格式: #ifdef 標識符 程序段1 #else 程序段2 #endif 功能:若標識符已經(jīng)被定義過,則對程序段1進行 編譯,否則,對程序段2進行編譯。 2.條件編譯命令格式二
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商業(yè)樓宇電工施工合同樣本
- 美食節(jié)美食模特合作協(xié)議
- 房屋擴建工程私人施工合同
- 水上樂園建設(shè)招投標合同安排
- 城市污水處理設(shè)施建設(shè)拆遷合同
- 食品銷售合同
- 建筑工程總監(jiān)聘用合同范文
- 家裝低價改造合同范例
- 鐵路軌道維修工程合同三篇
- 藥品捐贈合同(2篇)
- 物資配送管理投標方案范本
- pt100-熱電阻分度表-xls
- 預(yù)防校園暴力事件矛盾糾紛排查記錄表
- 定向鉆施工技術(shù)交底記錄
- 新能源發(fā)電技術(shù)概述課件
- 遼寧省葫蘆島市綏中縣遼師大版四年級上冊期中階段檢測英語試卷(原卷版)
- 邏輯思維訓練第三章命題
- 加油站設(shè)備及工藝管線安裝工程施工方案
- 升維:不確定時代的決策博弈
- 2023北京通州區(qū)初二上期末考生物試卷及答案
- 《西式面點實訓》課程標準
評論
0/150
提交評論