为了账号安全,请及时绑定邮箱和手机立即绑定

C语言中的宏与函数

C语言中的宏与函数

C
慕侠2389804 2019-10-06 12:58:08
我经常看到使用宏胜于使用函数的示例和案例。有人可以举例说明宏与函数相比的缺点吗?
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

宏功能

  • 宏已预处理

  • 无类型检查

  • 代码长度增加

  • 使用宏可能会导致副作用

  • 执行速度更快

  • 在将编译宏名称替换为宏值之前

  • 在小代码多次出现的地方很有用

  • 宏也没有检查编译错误

功能特点

  • 功能已编译

  • 类型检查已完成

  • 代码长度保持不变

  • 副作用

  • 执行速度较慢

  • 在函数调用期间,发生控制转移

  • 在大型代码多次出现的地方很有用

  • 功能检查编译错误


查看完整回答
反对 回复 2019-10-06
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

副作用很大。这是一个典型的情况:


#define min(a, b) (a < b ? a : b)


min(x++, y)

扩展到:


(x++ < y ? x++ : y)

x在同一条语句中增加两次。(以及未定义的行为)


编写多行宏也很麻烦:


#define foo(a,b,c)  \

    a += 10;        \

    b += 10;        \

    c += 10;

他们要求\在每行的末尾。


宏不能“返回”任何东西,除非您将其设为单个表达式:


int foo(int *a, int *b){

    side_effect0();

    side_effect1();

    return a[0] + b[0];

}

除非您使用GCC的expression语句,否则无法在宏中执行此操作。(编辑:虽然您可以使用逗号运算符...但是忽略了它...但是它可能仍然不太可读。)


操作顺序:(由@ouah提供)


#define min(a,b) (a < b ? a : b)


min(x & 0xFF, 42)

扩展到:


(x & 0xFF < 42 ? x & 0xFF : 42)

但&优先级低于<。因此0xFF < 42首先被评估。


查看完整回答
反对 回复 2019-10-06
  • 3 回答
  • 0 关注
  • 491 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信