[原创文章欢迎转载,但请保留作者信息]
Justin 于 2009-10-23
这回讲的是#define的问题。
很多面经上面都不会缺少关于代码中常数一定要define一下增加可读性等等。认真D学习鸟Item2我才知道:看来我也算是中毒不浅……
大师第二堂课的中心思想是:
-
同学们以后需要定义常量时,不要用#define啦,改用const修饰的变量或是用enum吧
-
要想写一些简短小函数时,别考虑#define啦,改用template+inline吧
光知其然当然不行,下面是其所以然:
-
原因是用const减小了代码大小,同时还使得封装(encapsulation)变得可行,而且,在调试的时候,因为const定义的变量是会加在符号表(Symbol Table)的,就比#define的常量要方便跟踪了(在预处理阶段,常量的名字就已经被替换掉了)
在一些特定的情况下(自己去查书啦,懒得抄书了)如果不能用const取代#define,就用enum。除了不能获取一个enum的地址之外,这种方法和const的用法其实差不多。
-
inline函数和宏有个共同的地方,他们都不会有函数调用的栈的开销。再喊上模板(template)来帮忙,就不用去考虑实际调用时的参数类型。
有了这两兄弟,就可以淘汰掉#define了,因为这个家伙出现的地方经常会很隐蔽地“强奸”传进的参数,出来以后可能就已经不成人样了。比如说:传进a++作为参数……(OK,又到了自己去看书找例子的时候了:))
于是乎,在const、enum和模板inline的联合进攻下,#define溃不成军痛哭流涕尿着裤子泪奔而去~