巨集定義 define括號使用的深入認識

2021-07-09 09:18:58 字數 1957 閱讀 8928

巨集定義:注意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...