標籤:
摘抄自:http://blog.chinaunix.net/uid-17188120-id-4026378.html
1.簡單的宏定義
#define 標識符 其他清單(其他清單可以是數,字串字面量,標點符號,運算子,標識符,關鍵字,字元常量。注意:其他清單是可以為空白的)
典型的使用方法:
定義值為空白
#define BUG
重新定義資料類型
#define IT int
2.帶參數的宏
#define 標識符(x1,x2,x3...xn) 其他清單 (注意:x1,x2,x3..是宏的參數,標識符和其左括弧之間不能有空格)
使用方法:
#define MAX(x,y) ((x)>(y)?(x):(y))
i=MAX(j+k,m-n);
替換為:
i=MAX((j+k)>(m-n)?(j+k):(m-n));
#define SI_EX(n) ((n)%2==0)
if(SI_EX(i)) i++;
替換為:
if((n)%2==0))
通過以上例子我們可以看出,標識符帶參數(X1,X2,X3.....)在替換時會被其他清單(Y1,Y2,Y3....)對應的替換,但是和順序無關。
3.define的多行定義
define可以替代多行的代碼,在每一個換行的時候加上一個"\"
#define MAX(X,Y) do { \
語句1; \
語句2; \
/* 注釋的寫法 */ \
} while(0) /* (no trailing ; ) */ \
4.在大規模的開發過程中,特別是跨平台和系統的軟體裡,define最重要的功能是條件編譯。
#ifdef WINDOWS
......
#endif
#ifdef LINUX
......
#endif
可以在編譯的時候通過#define設定編譯環境
5.取消宏
#undef 標識符
6.條件編譯
#ifdef XXX…(#else) … #endif
控制是否顯示調試資訊
#ifdef BUGPRINT
#define BUG(arg1,arg2) printf(arg1,arg2)
#elif
#define BUG
#endif
7.預定義宏
在C語言中收錄了一些有用的宏,這些宏是提供當前編譯資訊的。
__LINE__ 被編譯檔案的行數
(整型)
__FILE__ 被編譯檔案的名字 (字元型)
__DATE__ 編譯日期 (字元型)
__TIME__ 編譯時間 (字元型)
__STDC__ 如果編譯器接受標準C,那麼值為1. (整型)
通常我們在編譯的時候我們可以用這些預定義的宏來進行排錯,例如:
一般情況下,當出現除零的情況時編譯器是沒有提示的,我們可以自訂一個解決辦法。
#define CHECKZERO(divisor)\
if(divisor==0)\
printf("***ATTEMPT TO DIVIDE BY ZERO IN LINE %d of file %s ***\n",__LINE__,__FILE__);\
宏定義(轉)