c语言宏函数作用,C语言中的宏与函数

ce48b8bdbc13fd5ceeb476d3f78c5d1f.png

蛊毒传说

宏容易出错,因为宏依赖于文本替换并且不执行类型检查。例如,此宏:#define square(a) a * a与整数一起使用时可以正常工作:square(5) --> 5 * 5 --> 25但是当与表达式一起使用时,会做非常奇怪的事情:square(1 + 2) --> 1 + 2 * 1 + 2 --> 1 + 2 + 2 --> 5square(x++) --> x++ * x++ --> increments x twice在参数周围加上括号会有所帮助,但不能完全消除这些问题。当宏包含多个语句时,您可能会遇到控制流构造的麻烦:#define swap(x, y) t = x; x = y; y = t;if (x < y) swap(x, y); -->if (x < y) t = x; x = y; y = t; --> if (x < y) { t = x; } x = y; y = t;解决此问题的通常策略是将语句放入“ do {...} while(0)”循环中。如果您有两个结构恰好包含一个具有相同名称但语义不同的字段,则同一个宏可能同时作用于这两个结构,结果很奇怪:struct shirt {    int numButtons;};struct webpage {    int numButtons;};#define num_button_holes(shirt)  ((shirt).numButtons * 4)struct webpage page;page.numButtons = 2;num_button_holes(page) -> 8最后,宏可能难以调试,产生奇怪的语法错误或运行时错误,您必须扩展这些错误才能理解(例如,使用gcc -E),因为调试器无法单步执行宏,如以下示例所示:#define print(x, y)  printf(x y)  /* accidentally forgot comma */print("foo %s", "bar") /* prints "foo %sbar" */内联函数和常量有助于避免许多此类宏问题,但并不总是适用。在故意使用宏指定多态行为的情况下,可能很难避免意外的多态性。C ++具有许多功能,例如模板,可在不使用宏的情况下以类型安全的方式帮助创建复杂的多态构造。有关详细信息,请参见Stroustrup的C ++编程语言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值