#if 1 #include// 注意空格 #define F (x) ((x) - 1) // F代表後面 #define F(x) ((x) - 1) // F(x)代表後面 #define T1 struct type* T1 a,b; // 使用上面在定義多個變量時達不到目的,被解析為struct type* a,b; a為指向結構體的指針,而b被定義為一個結構體 // 經典的筆試題宏定義求最大值 //#define max(a,b) a>b?a:b //這個很容易錯,下面的比較不容易錯,但是也會有錯的時候 #define max(a,b) ((a)>(b)?(a):(b)) // 寫成這樣得不到滿分,仍然可能會出現問題,解釋如下 // 同時這個宏定義也沒有考慮傳入不同類型的參數情況, /* * 如果一個操作數在兩處被用到,就會被求值兩次; * 表達式max(a,b)中如果帶有副作用,在比較大小時會計算一次,在後面計算值時也會計算一次 * 錯誤例子如下 : */ int main(int argc, char** argv) { int x[3] = {2,3,1}; int biggest = x[0]; int i = 1; while(i < 3) { biggest = max(biggest, x[i++]); // 被拆解為biggest > x[i++]?biggest:x[i++],(biggest=2)<(x[1]=3) // 關鍵點在於i在比較大小時有副作用,i++在後時i已經加1,biggest=x[2] } // 解決方法是確定參數中沒有副作用,或則直接編寫max函數 printf("biggest is %d\n",biggest); // 一種考慮傳入不同變量類型的max宏定義 //比較正確的答案應為: #define MAX(a,b) ({ \ const typeof(a) _a = a; \ const typeof(b) _b = b; \ (void)(&_a == &_b); \ _a > _b ? _a : _b;}) return 0; } // 下面是測試大小端的方法 ,已經使用#if #elif 需要自己打開相應開關 // 補充一個 (int&)a是什麼意思 ?(int&)a就是*(int*)(&a) #elif 1 #include int main() { int x = 1; char *p = (char *)&x; if(*p) { printf("little\n"); } else { printf("large\n"); } return 0; } #else #include int main() { short int x; char x1,x2; x = 0x1122; x1 = ((char *)&x)[0]; //低地址 x2 = ((char *)&x)[1]; //高地址 printf("x1=%x\n",x1); printf("x2=%x\n",x2); return 0; } #endif
宏定義和大小端