1.像函数的宏
后面这个参数是没有类型的.
我们来看一个这种宏的例子:
2.错误定义的宏
这两个宏都是错误定义的.为什么?很简单,我们来试一下就知道了:
运行结果如下:
我们想做的事情是从弧度转换为角度.可以看到结果并不符合我们的预期.其实,我们替换之后实际上得到的结果是这样的.
那么这两行到底错在哪?或者说正确的该怎么写呢?
3.带参数的宏的原则
所以在我们定义这种带参数的宏的时候,有一个非常重要的基本原则,就是一切都要有括号.
4.带参数的宏
这种带参数的宏呢
还有,在这种宏定义的时候,后面千万不要加分号.
因为以我们的习惯我们看定会在每个语句的末尾都加上分号所以第一句打印就会有两个分号.第一个分号表示的是打印语句的结束,第二个分号表示空语句,就使得后面这个else没地方可接了.
当它去代替函数的时候,运行效率会比函数来得高,当然因为它到处展开,所以它的代码的大小可能会比调用函数要来得大.但是呢,这是牺牲空间来换取效率的.而且这种宏可以做的非常非常复杂,
第二点简单来说:#运算符可以让参数转成字符串,增强灵活性.使用##可以拼接标识符,动态生成代码.这些特性使得宏能够执行非常复杂的操作,但也增加了代码的复杂性和调试难度.滥用这些特性会导致代码难以阅读和维护.
第三点,中国程序员会比较少去使用宏(really?),但是在西方人做的大型程序里面,这些东西是非常常见的.但是宏有一个很大的缺点,就是它去做展开的时候是没有任何类型检查的.这时候inline就做的比宏要好.(不深入展开)
5.其他编译预处理指令