巨集定義:注意x,y值都有乙個括號,和特定的符號時 需要加上括號!
// swap(x, y) 交換x,y的值
#define swap(x, y) \
(y) = (x) + (y); \
(x) = (y) - (x); \
(y) = (y) - (x);
求最大值和最小值
#define max( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define min( x, y ) ( ((x) < (y)) ? (x) : (y) )
寫乙個「標準」巨集min,這個巨集輸入兩個引數並返回較小的乙個。另外,當你寫下面的**時會發生什麼事?
least = min(*p++, b);
解答:#define min(a,b) ((a) <= (b) ? (a) : (b)) 注意外面還有一層括號!!
min(*p++, b)會產生巨集的***
剖析:這個面試題主要考查面試者對巨集定義的使用,巨集定義可以實現類似於函式的功能,但是它終歸不是函式,而巨集定義中括弧中的「引數」也不是真的引數,在巨集展開的時候對「引數」進行的是
一對一的替換。
程式設計師對巨集定義的使用要非常小心,特別要注意兩個問題:
(1)謹慎地將巨集定義中的「引數」和整個巨集用用括弧括起來。所以,嚴格地講,下述解答:
#define min(a,b) (a) <= (b) ? (a) : (b)
#define min(a,b) (a <= b ? a : b )
都應判0分;
(2)防止巨集的***。
巨集定義#define min(a,b) ((a) <= (b) ? (a) : (b))對min(*p++, b)的作用結果是:
((*p++) <= (b) ? (*p++) : (b))
這個表示式會產生***,指標p會作兩次++自增操作。
除此之外,另乙個應該判0分的解答是:
#define min(a,b) ((a) <= (b) ? (a) : (b));
這個解答在巨集定義的後面加「;」,顯示編寫者對巨集的概念模糊不清。
將乙個字母轉換為大寫
#define upcase( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
返回陣列元素的個數
#define arr_size( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
對於io空間對映在儲存空間的結構,輸入輸出處理
#define inp(port) (*((volatile byte *) (port)))
#define inpw(port) (*((volatile word *) (port)))
#define inpdw(port) (*((volatile dword *)(port)))
#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))
#define outpw(port, val) (*((volatile word *) (port)) = ((word) (val)))
#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))
得到乙個字的高位和低位位元組
#define word_lo(***) ((byte) ((word)(***) & 255))
#define word_hi(***) ((byte) ((word)(***) >> 8))
在巨集之中用do{}while(0)語句包含多語句防止錯誤。
巨集中"#"和"##"的用法 我們使用#把巨集引數變為乙個字串,用##把兩個巨集引數貼合在一起.
define巨集定義
預處理指令 以 開頭的行,都預處理指令,用於指示編譯器做一些預處理工作。比如 include h 注 預處理指令不是語句,行尾不要加分號 define的兩種用法 1.定義乙個 數值 2.定義乙個 算式 注 工程中應該避免使用這兩種方式 定義乙個值 define pi 3.14 int main 定義...
巨集定義 define
巨集定義又稱為巨集代換 巨集替換,簡稱 巨集 格式 define 識別符號 字串 其中的識別符號就是所謂的符號常量,也稱為 巨集名 預處理 預編譯 工作也叫做巨集展開 將巨集名替換為字串。1 define printx printf d n x 在c程式中,以 字元開頭的 都是一條c預處理器語句。預...
define巨集定義
include include define sub x,y x y define access before element,offset,value sub element,offset value using namespace std int main access before array...