宏及條件編譯:
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)蘿北,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575宏的概念
被定義為"宏"的表示符稱為"宏名"。在編譯預(yù)處理時,對程序中所出現(xiàn)的"宏名",都用宏定義中的字符串去代換,這稱為"宏代換“或”宏展開" 宏定義是由源程序中的宏定義命令完成的,宏代換是由預(yù)處理程序自動完成的.在C語言中,"宏分為有參和無參數(shù)兩種" 無參宏的宏名后不帶參數(shù),其定義的一般形式為: #define 標(biāo)示符 字符串 # 表示這是一條預(yù)處理命令,凡是以"#"開頭的均為預(yù)處理命令 define 為宏定義命令 標(biāo)示符 為所定義的宏名 字符串 可以是常數(shù)、表達式、格式串等注意事項:
1.習(xí)慣上宏名用大寫字母表示,以便于與變量區(qū)別,但也允許用小寫字母 2.宏定義時用宏名來表示一個字符串,在宏展開時又以該字符串取代宏名,這只是一種簡單地代換,字符串中可以含任何字符,可以是常量,也可以是表達式,預(yù)處理程序?qū)λ蛔魅魏螜z查.如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn) 3.宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換 4.宏定義必須寫在函數(shù)之外,其作用域為宏定義命令到源程序結(jié)束.如要終止其作用域可使用 #undef命令 5.宏定義允許嵌套 #define R 4 #define PI 3.14 #define AREA R*PI //嵌套定義 6.宏名在源程序中若用 "" 括起來,則預(yù)處理程序不對其做宏代換 7.可用宏定義表示數(shù)據(jù)類型,使書寫方便 #define INT int INT a; a=10; //相當(dāng)于用宏給 int 起了一個別名 #define P struct Person P{ int age; }; P p1= {24};有參宏的定義方法和使用
C語言允許宏帶有參數(shù).在宏定義中的參數(shù)稱為形式參數(shù),在宏調(diào)用中的參數(shù)稱為實際參數(shù) 對帶參數(shù)的宏,在調(diào)用中,不僅要宏展開,而且要用實參去代換形參 帶參宏定義的一般形式為: #define 宏名(形參1,形參2...) 字符串 帶參宏調(diào)用的一般形式為: 宏名(實參1,實參2..); 例: #define SUM(a) a+a int result=SUM(3); printf("%d ",result);有參宏使用的注意事項
1.帶參宏定義中,形參之間可以出現(xiàn)空格,但是宏名和形參表之間不能有空格出現(xiàn) 2.在帶參宏定義中,形式參數(shù)不分配內(nèi)存單元,因此不必作類型定義.而宏調(diào)用中的實參是具體的值.要用它們?nèi)ゴ鷵Q形參,因此必須作類型說明.這是與函數(shù)中的情況不同的.在函數(shù)中,形參和實參是兩個不同的量,各有自己的作用域,調(diào)用時要把實參值賦予形參,進行"值傳遞"。而在帶參宏中,只是符號代換,不存在值傳遞的問題 3.在宏定義中的形參是標(biāo)識符,而宏調(diào)用中的實參可以是表達式 4.在宏定義中,字符串內(nèi)的形參通常要用括號括起來以避免出錯,在上例中的宏定義中(y)*(y)表達式的y都用括號括起來,因此結(jié)果是正確的 例如:#define SUM(x,y) (x)*(y)+(x)+(y) 5.宏定義也可用來定義多個語句,在宏調(diào)用時,把這些語句又代換到源程序內(nèi) 例:#define M3(m,n) m=a+2;n=a*2;應(yīng)用:
定義一個有參宏,求大值 #define MAX(a,b) a>b?a:b同樣定義別名時 #define 和 typedef的區(qū)別
宏定義只是簡單地字符串代換,宏是在預(yù)處理完成的,而typedef是在編譯時處理的,它不是作簡單地代換,而是對類型說明符重新命名.被命名的標(biāo)識符具有類型定義說明的功能 例: #define PIN1 int* typedef int *PIN2; PIN1 a,b;//這里的a 是 int* 而b是int PIN2 a1,b1;// 這里a1,b1 都是int* 產(chǎn)生差異的原因在于 一個是預(yù)處理階段 一個是編譯階段條件編譯的概念和優(yōu)點:
1.為什么要使用條件編譯
1)按不同的條件去編譯不同的程序部分,因而產(chǎn)生不同的目標(biāo)代碼文件.有利于程序的移植和調(diào)試 2)條件編譯當(dāng)然也可以用條件語句來實現(xiàn).但是用條件語句將會對整個源程序進行編譯,生產(chǎn)的目標(biāo)代碼程序很長,而采用條件編譯,則根據(jù)條件只編譯其中的程序段1或程序段2,生產(chǎn)的目標(biāo)程序較短2. #if-#else條件編譯指令
格式: #if 常量表達式 程序段1 #elif 常量表達式 程序段2 #else 程序段3 #endif 缺點: 判斷的依據(jù)是宏定義中的數(shù)據(jù),而不是編譯器中的3 #ifdef用來半段某個宏是否定義,定義為ture
例: int a =0; #ifdef DEBUG a =10; #else a=1000; #endif4. #ifndef 用來判斷某個宏是否定義,沒定義為true
當(dāng)使用條件編譯指令調(diào)試BUG,類似于JAVA中的LOG管理
條件:
DEBUG1 = 1 顯示調(diào)試信息
DEBUG1 = 0 不顯示調(diào)試信息
#define DEBUG=1 #if DEBUG1==1 #define Log(format,...) printf(format,## __VA_ARGS__); #elif DEBUG1==0 #define Log(format,...) #else #define Log(format,...) #endif 使用 Log("XXXXX-->",10); //format 代表形參 ...表示可變參數(shù) 也類似于java中的泛型 //##標(biāo)示可以有參數(shù)也可以沒有參數(shù) ,如果沒有##就至少有一個參數(shù)
網(wǎng)站題目:C語言預(yù)處理命令-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://muchs.cn/article40/pddho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站策劃、外貿(mào)建站、小程序開發(fā)、虛擬主機、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容