#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;
}
本文通过C语言中的宏定义MIN_A、MIN_B和MIN_C展示了宏副作用的问题,并提供了逐步改进的解决方案。首先介绍了简单的宏定义可能导致的参数多次计算错误,然后通过传递类型信息解决了部分问题,最后给出了一个通用且安全的宏实现。
2146

被折叠的 条评论
为什么被折叠?



