首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++中的宏与函数

C++中的宏与函数
EN

Stack Overflow用户
提问于 2012-02-02 06:50:24
回答 6查看 94K关注 0票数 112

我经常看到使用宏比使用函数更好的例子。

有没有人能举个例子给我解释一下宏与函数相比的缺点?

EN

回答 6

Stack Overflow用户

发布于 2012-02-02 06:53:00

示例1:

代码语言:javascript
复制
#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;
}

鉴于:

代码语言:javascript
复制
int square(int x) {
  return x * x;
}

int main() {
  int x = 2;
  int y = square(x++); // fine
  return 0;
}

示例2:

代码语言:javascript
复制
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;
}

对比:

代码语言:javascript
复制
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;
}
票数 14
EN

Stack Overflow用户

发布于 2012-02-02 06:52:32

没有对参数和代码进行类型检查,这可能会导致代码膨胀。宏语法还可能导致许多奇怪的边缘情况,其中分号或优先顺序可能会成为障碍。这是一个演示一些宏evil的链接

票数 12
EN

Stack Overflow用户

发布于 2012-02-02 07:55:33

宏的一个缺点是调试器读取源代码,而源代码中没有展开的宏,因此在宏中运行调试器不一定有用。不用说,您不能像在函数中那样在宏内设置断点。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9104568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档