簡(jiǎn)單的#define定義
#define MAXTIME 1000
一個(gè)簡(jiǎn)單的MAXTIME就定義好了硬耍,它代表1000,如果在程序里面寫 if(i<MAXTIME){.........}
編譯器在處理這個(gè)代碼之前會(huì)對(duì)MAXTIME進(jìn)行處理替換為1000.這樣的定義看起來類似于普通的常量定義CONST容贝,但也有著不同佳励,因?yàn)閐efine的定義更像是簡(jiǎn)單的文本替換,而不是作為一個(gè)量來使用座每。
#define的函數(shù)定義
define可以像函數(shù)那樣接受一些參數(shù)狮惜,如下
#define max(x,y) (x)>(y)?(x):(y);
但是存在隱患
比如:
#define pin (int*);
pin a,b;
本意是a和b都是int型指針高诺,但是實(shí)際上變成int* a,b; a是int型指針,而b是int型變量碾篡。 這是應(yīng)該使用typedef來代替define虱而,這樣a和b就都是int型指針了。 所以我們?cè)诙x的時(shí)候开泽,養(yǎng)成一個(gè)良好的習(xí)慣牡拇,建議所有的層次都要加括號(hào)。
#define的多行定義
define可以替代多行的代碼穆律,例如MFC中的宏定義
#define MACRO(arg1, arg2)
do { \
/* declarations */ \
stmt1; \
stmt2; \
/* ... */ \
} while(0) /* (no trailing ; ) */
關(guān)鍵是要在每一個(gè)換行的時(shí)候加上一個(gè)"\" 惠呼。
#define的條件編譯
在大規(guī)模的開發(fā)過程中,特別是跨平臺(tái)和系統(tǒng)的軟件里众旗,define最重要的功能是條件編譯
就是:
#ifdef XXX…(#else) … #endif
#ifdef DV22_AUX_INPUT
#define AUX_MODE 3
#else
#define AUY_MODE 3
#endif
可以在編譯的時(shí)候通過#define設(shè)置編譯環(huán)境
如何定義宏罢杉,取消宏
//定義宏
#define [MacroName] [MacroValue]
//取消宏
#undef [MacroName]
//普通宏
#define PI (3.1415926)
//帶參數(shù)的宏
#define max(a,b) ((a)>(b)? (a),(b))//這個(gè)要慎用
頭文件(.h)可以被頭文件或C文件包含
重復(fù)包含(重復(fù)定義) 由于頭文件包含可以嵌套趟畏,那么C文件就有可能包含多次同一個(gè)頭文件贡歧,就可能出現(xiàn)重復(fù)定義的問題的。 通過條件編譯開關(guān)來避免重復(fù)包含(重復(fù)定義) 例如
#ifndef __headerfileXXX__
#define __headerfileXXX__
…
//文件內(nèi)容
…
#endif
//#ifdef的使用和#if defined()的用法一致
//#ifndef又和#if !defined()的用法一致赋秀。
重新定義一些類型利朵,防止由于各種平臺(tái)和編譯器的不同,而產(chǎn)生的類型字節(jié)數(shù)差異猎莲,方便移植绍弟。
typedef unsigned char boolean; /* Boolean value type. */
typedef unsigned long int uint32; /* Unsigned 32 bit value */
typedef unsigned short uint16; /* Unsigned 16 bit value */
typedef unsigned char uint8; /* Unsigned 8 bit value */
typedef signed long int int32; /* Signed 32 bit value */
typedef signed short int16; /* Signed 16 bit value */
typedef signed char int8; /* Signed 8 bit value */
參考百度文庫