新聞中心
1、概念
命令有兩種格式:一種是簡單的宏定義,另一種是帶參數(shù)的宏定義。

創(chuàng)新互聯(lián)是專業(yè)的渾江網(wǎng)站建設公司,渾江接單;提供成都網(wǎng)站制作、網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行渾江網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
(1) 簡單的宏定義:
#define <宏名> <字符串>
#define VALUE ((sizeof(a)) /sizeof(a[0]))
(2) 帶參數(shù)的宏定義 #define <宏名> (<參數(shù)表>) <宏體>
#define MAX(a,b) ((a)>(b)?(a):(b))
2、不能忽略宏定義中的空格
下面的宏定義中f是否帶了參數(shù)呢?
#define f (x) ((x)+1)
答案是否定的,在f與(x)之間存在一個空格,導致變成了如下定義。
#define f (x)((x)+1)
預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開后的源程序時發(fā)現(xiàn)。
3、宏不是函數(shù)
如果我們定義一個宏:
#define MAX(a,b) a>b?a:b
當我們執(zhí)行一個語句:
3+MAX(1,3);
我們期望的答案應該是6才對,其實呢,運行之后的答案1。與宏定義相掛鉤的就是優(yōu)先級,算數(shù)運算符的優(yōu)先級高于條件運算符,展開如下。
3+1>3?1:3,首先進行算符運算符的運算,即4>3?1:3,所以答案為1。
請注意宏定義中的括號,這些括號的作用就是預防引起優(yōu)先級相關的問題。有些專家建議在C語言中只要牢記兩個優(yōu)先級就夠了,乘除法優(yōu)先級高于加減法,在設計其它操作符時,一律加上括號。
4、宏定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換
5、宏不是類型定義
首先定義一個宏
#define pChar char*
再用pChar 定義兩個變量,之后用操作符sizeof讀取變量所占用內存大小,如果是指針類型的就占4個字節(jié),如果是字符型的就占1個字節(jié)。
結果占用空間不一樣,變量類型自然不一樣,所以宏定義不是類型定義。那如果我換成typedef來定義類型呢?
宏定義只是簡單的字符串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對類型說明符重新命名。被命名的標識符具有類型定義說明。
6、與之相關的宏定義
編寫程序過程中,很多都需要條件編譯,來看一個常用的使用方法。
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
7、總結
宏的本質是代碼替換。
文章名稱:C語言中宏定義的盲區(qū)有哪些?
分享鏈接:http://www.dlmjj.cn/article/dhodhgd.html


咨詢
建站咨詢
