宏定義多條語句
宏定義多條語句可以用如下的形式進行定義:
#define swap(a,b) { a = a + b; b = a - b; a = a - b; }
// 如果分行寫,可以寫成如下形式
#define swap(a,b) { a = a + b;\
b = a - b;\
a = a - b;}
宏定義一般分為帶參宏定義和不帶參宏定義。
帶參宏定義,也即帶參數的宏定義,如:
#define MAX(a,b) ((a)>(b) ? (a) : (b)) // 求最大值不帶參宏定義,也即不帶參數的宏定義,如:
#define PI 3.14159 // 定義圓周率pi的值
一個C語言的宏定義語句
#define WRITE(DATATYPE,DATA) do{*(DATATYPE*)(save_offset)=DATA;save_offset +=sizeof(DATATYPE);}while(0)
我建議宏這樣寫比較好,可以避免很多麻煩。
save_offset 是unsigned int型。意思是存放指針地址數據的地方,不是指針類型,是你所說的普通變量,0-65535之間(我取的是2個字節所以是2的16次方 - 1,但不一定是這個數,根據編譯器不同而不同)。
DATATYPE 是變量類型 譬如 int ,char型。
(DATATYPE*)(save_offset) 強制轉換為DATATYPE類型指針;*(DATATYPE*)(save_offset)意思是在0x0000地址寫入DATA。
save_offset +=sizeof(DATATYPE) 這句話意思是 save_offset取下一個地址。
這個宏定義的主要功能是 在0x0000開頭的內存中寫入DATATYPE數據。
例如:
WRITE(char,128);
宏展開之后是:
do{*(char*)(save_offset)=128;save_offset +=sizeof(char);}while(0)
執行過后
在內存地址為0x0000處寫入數據128占據sizeof(char)個字節,并在0x0000 + sizeof(char)處等待下一個數據的寫入。
大概就是這個意思。
有關宏定義
在C中,常用預處理語句#define來代替一個函數定義。例如:
#define MAX(a,b) ((a)>(b)?(a):(b))
該語句使得程序中每個出現MAX(a,b)函數調用的地方都被宏定義中后面的表達式((a)>(b)?(a):(b))所替換。
宏定義語句的書寫格式有過分的講究, MAX與括號之間不能有空格,所有的參數都要
放在括號里。盡管如此,它還是有麻煩:
int a=1,b=0;
MAX(a++,b); //a被增值2次
MAX(a++,b+10); //a被增值1次
MAX(a,"Hello"); //錯誤地比較int和字符串,沒有參數類型檢查
MAX( )函數的求值會由于兩個參數值的大小不同而產生不同的副作用。
MAX(a++,b)的值為2,同時a的值為3;
MAX(a++,b+10)的值為10,同時a的值為2。
如果是普通函數,則MAX(a,"HellO")會受到函數調用的檢查,但此處不會因為兩個參數類型不同而被編譯拒之門外。幸運的是,通過一個內聯函數可以得到所有宏的替換效能和 所有可預見的狀態以及常規函數的類型檢查:
inline int MAX(int a,int b)
{
return a>b?a:b;
}