#if 1 #include <stdio.h> // 注意空格 #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<stdio.h> int main() { int x = 1; char *p = (char *)&x; if(*p) { printf("little\n"); } else { printf("large\n"); } return 0; } #else #include <stdio.h> 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
宏定义和大小端
原文地址:http://blog.csdn.net/human_evolution/article/details/40785739