C/C++中宏的使用
C/C++中使用宏非常的方便,比如下面这一行实现两个元素的交换
cpp代码
- #define exch(A,B) { Item t = A; A = B; B = t;}
但是宏有一个潜在的问题,详见《C++编程思想》关于内联函数一章的具体内容。
问题是什么列?就是宏只是简单的代码替换,并没有内联函数那样的生成临时变量的功能。今天我着实被这个问题坑的很惨。三路划分的快速排序算法结果总是不正确,搞了半个多小时,才发现问题。
如果使用上面的exch的宏,下面的代码就会出现问题
cpp代码
- exch(a[++p],a[i]);
- exch(a[--q],a[j]);
你会发现,被交换的元素的索引是不正确的,总是位于期望元素的后面一个。最终导致结果出错。
问题就出在宏上面。这里不用把++p、--q这样的放到下标中,必须在事前计算好,直接放变量,如a[p]、a[q]。因为宏是实现的整字替换,那么结果就是
cpp代码
- Item t = a[++p]; a[++p] = a[i]; a[i] = t;
然后就悲剧了。
看书必须敲代码,不敲代码,犯一些错误,印象不深刻啊。你要是问我C++的内联函数有什么好处,以及关于内联函数的地址分配等问题,我肯定能背出书上的内容。但是背书没用啊,轮到自己敲代码的时候就傻×了。
Tags:
上一篇:
一个国外的广告网站readbud
下一篇:
使用GDB调试NS2程序
相关日志推荐
Chuanle | 2010-08-28 15:55:48
博主,我现在想把百度空间搬到Wordpress,用了你的工具,严格按照教程来做的,可是怎么都无法导出成功,不知道是什么原因?我截了图,你可以看看:http://www.chuanle.net/python.jpgyhustc | 2010-08-30 09:31:24
百度空间的页面结构发生了变化,我那个工具只是当时自己搬家的时候写的,后来就再也没有维护过了。因为百度和网易只要模版结构更新一下,就要修改程序重新发布,没有这个精力。Chuanle | 2010-08-30 15:27:07
哦,太可惜了,你这个搬家工具是我找到的最好的,能搬一切...既然不能搬那就算了,就留在那里纪念吧。感谢了哈哈。