前言 :
這裡簡單說明了 #define 的幾種使用方法.
簡單的define定義 :
#define MAXTIME 1000
一個簡單的MAXTIME就定義好了,它代表1000,如果在程序裡面寫 :
int i = MAXTIME;
編譯器在處理這個代碼之前會對MAXTIME進行處理替換為1000。
這樣的定義看起來類似於普通的常量定義CONST,但也有著不同,因為define的定義更像是簡單的文本替換,而不是作為一個量來使用.
define的"函數定義" :
define可以像函數那樣接受一些參數,參考範例如下 :
#define max(x,y) (x)>(y)?(x):(y);
這個定義就將返回兩個數中較大的那個,看到了嗎? 因為這個"函數"沒有類型檢查,就好像一個函數模板似的,當然,它絕對沒有模板那麼安全就是了. 可以作為一個簡單的模板來使用而已. 但是這樣做的話存在隱患,例子如下 :
#define Add(a,b) a+b;
在一般使用的時候是沒有問題的,但是如果遇到如 : c * Add(a,b) * d 的時候就會出現問題, 代數式的本意是a+b然後去和c,d相乘,但是因為使用了define(它只是一個簡單的替換),所以式子實際上變成了:
c*a + b*d
另外舉一個例子 :
本意是a和b都是int型指針,但是實際上變成int* a,b;
a是int型指針,而b是int型變量. 這是應該使用typedef來代替define,這樣a和b就都是int型指針了. 所以我們在定義的時候,養成一個良好的習慣,建議所有的層次都要加括號.
宏的單行定義 :
考慮下列 #define 用法 :
我們假設:x=1,則會有 :
define的多行定義 :
define可以替代多行的代碼,例如MFC中的宏定義(非常的經典,雖然讓人看了噁心):
- #define MACRO(arg1, arg2) do { \
- /* declarations */ \
- stmt1; \
- stmt2; \
- /* ... */ \
- } while(0) /* (no trailing ; ) */
define的條件編譯 :
- #ifdef WINDOWS
- ......
- ......
- #endif
- #ifdef LINUX
- ......
- ......
- #endif
如何定義宏、取消宏 :
關鍵是十分容易產生錯誤,包括機器和人理解上的差異等等.
條件編譯 :
#ifdef XXX…(#else) …#endif
例如 :
避免頭文件重複定義 :
由於頭文件包含可以嵌套,那麼C文件就有可能包含多次同一個頭文件,就可能出現重複定義的問題的. 通過條件編譯開關來避免重複引用, 例如 :
補充說明 :
* 楊舒凱 - C/C++ : 前置處理指令
* 一些 C Macro 的技巧
* C語言巨集定義技巧
沒有留言:
張貼留言