#include <stdio.h>
/*
* About: Demo of macro side effective and how to resolve it
* Author : FurtherChan
* Date: Sat Apr 24,2010
*/
#define MIN_A(x, y) ((x) < (y) ? (x) : (y))
#define MIN_B(type, x, y) ({type _x = (x); type _y = (y);/
_x < _y ? _x : _y;})
#define MIN_C(x, y) ({typeof(x) _x = (x); typeof(y) _y = (y);/
(void)(&_x == &_y); _x < _y ? _x : _y;})
int main(int argc, char *argv[])
{
//error usage, a & b will add many times
int a = 1, b = 2, min = 0;
min = MIN_A(++a, ++b);
printf("a = %d/n", a); //3
printf("b = %d/n", b); //3
printf("min = %d/n/n", min);//3
//good, but need pass type to macro
a = 1, b = 2, min = 0;
min = MIN_B(int, ++a, ++b);
printf("a = %d/n", a); //2
printf("b = %d/n", b); //3
printf("min = %d/n/n", min);//2
//perfect
a = 1, b = 2, min = 0;
min = MIN_C(++a, ++b);
printf("a = %d/n", a); //2
printf("b = %d/n", b); //3
printf("min = %d/n", min); //2
return 0;
}