写在前面,一些c/c++的书籍都对使用宏不是很推荐,因为确实太容易出问题,不过大神总是能用宏写出来非常牛逼的代码,当年读PyG的源码的时候就被作者使用宏自动编码的技术所折服(使用宏减少代码量是宏的精髓)。宏的用法千变万化,我对很多用法也是一知半解,因此只选了一些自己掌握的内容。
一,宏的缺点
宏不能访问对象的私有成员
宏的定义很容易产生二义性
#define Multi(x) (x*x)
如果用一个数字去调用它Multi(10)
,结果是100;但是如果用一个表达式Multi(10+10)
去调用的话,我们期待的结果是400,但是宏调用结果是(10+10*10+10)
,结果为120。为了避免这些错误,尽量给宏的参数都加上括号,包括最外层的括号。
#define MUL(A,B) ((A)*(B))
#define Multi(x) ((x)*(x))
这样在一定程度上可以保证能够程序不出错,但是对于有些情况还是不行,调用Multi(a++)
,宏展开式为(a++)*(a++)
,如果a=4
,结果为4*4=16,a=6
,而我们期望的是4*4=16,a=5
。
- 宏不会进行数据类型的安全检查,其只是简单的字符替换。