我经常看到使用宏比使用函数更好的例子。
有没有人能举个例子给我解释一下宏与函数相比的缺点?
发布于 2012-02-02 06:53:00
示例1:
#define SQUARE(x) ((x)*(x))
int main() {
int x = 2;
int y = SQUARE(x++); // Undefined behavior even though it doesn't look
// like it here
return 0;
}
鉴于:
int square(int x) {
return x * x;
}
int main() {
int x = 2;
int y = square(x++); // fine
return 0;
}
示例2:
struct foo {
int bar;
};
#define GET_BAR(f) ((f)->bar)
int main() {
struct foo f;
int a = GET_BAR(&f); // fine
int b = GET_BAR(&a); // error, but the message won't make much sense unless you
// know what the macro does
return 0;
}
对比:
struct foo {
int bar;
};
int get_bar(struct foo *f) {
return f->bar;
}
int main() {
struct foo f;
int a = get_bar(&f); // fine
int b = get_bar(&a); // error, but compiler complains about passing int* where
// struct foo* should be given
return 0;
}
发布于 2012-02-02 06:52:32
没有对参数和代码进行类型检查,这可能会导致代码膨胀。宏语法还可能导致许多奇怪的边缘情况,其中分号或优先顺序可能会成为障碍。这是一个演示一些宏evil的链接
发布于 2012-02-02 07:55:33
宏的一个缺点是调试器读取源代码,而源代码中没有展开的宏,因此在宏中运行调试器不一定有用。不用说,您不能像在函数中那样在宏内设置断点。
https://stackoverflow.com/questions/9104568
复制相似问题