C/C++中宏的使用

C/C++中使用宏非常的方便,比如下面这一行实现两个元素的交换

cpp代码
  1. #define exch(A,B) { Item t = A; A = B; B = t;} 

但是宏有一个潜在的问题,详见《C++编程思想》关于内联函数一章的具体内容。

问题是什么列?就是宏只是简单的代码替换,并没有内联函数那样的生成临时变量的功能。今天我着实被这个问题坑的很惨。三路划分的快速排序算法结果总是不正确,搞了半个多小时,才发现问题。

如果使用上面的exch的宏,下面的代码就会出现问题

cpp代码
  1. exch(a[++p],a[i]);  
  2. exch(a[--q],a[j]); 

你会发现,被交换的元素的索引是不正确的,总是位于期望元素的后面一个。最终导致结果出错。

问题就出在宏上面。这里不用把++p、--q这样的放到下标中,必须在事前计算好,直接放变量,如a[p]、a[q]。因为宏是实现的整字替换,那么结果就是

cpp代码
  1. Item t = a[++p]; a[++p] = a[i]; a[i] = t; 

然后就悲剧了。

看书必须敲代码,不敲代码,犯一些错误,印象不深刻啊。你要是问我C++的内联函数有什么好处,以及关于内联函数的地址分配等问题,我肯定能背出书上的内容。但是背书没用啊,轮到自己敲代码的时候就傻×了。

Tags:
上一篇: 一个国外的广告网站readbud
下一篇: 使用GDB调试NS2程序

相关日志推荐

3 条留言

  1. Chuanle  | 2010-08-28 15:55:48

    博主,我现在想把百度空间搬到Wordpress,用了你的工具,严格按照教程来做的,可是怎么都无法导出成功,不知道是什么原因?我截了图,你可以看看:http://www.chuanle.net/python.jpg
  2. yhustc  | 2010-08-30 09:31:24

    百度空间的页面结构发生了变化,我那个工具只是当时自己搬家的时候写的,后来就再也没有维护过了。因为百度和网易只要模版结构更新一下,就要修改程序重新发布,没有这个精力。
  3. Chuanle  | 2010-08-30 15:27:07

    哦,太可惜了,你这个搬家工具是我找到的最好的,能搬一切...既然不能搬那就算了,就留在那里纪念吧。感谢了哈哈。

发表评论

  
  
   (点击图片更换验证码)
点击刷新验证码