C语言的宏
前言
我这里实际上只是记录,不如直接看《宏定义黑魔法-从入门到奇技淫巧》知乎上的回答。 C语言的宏有两种类型,一种是obj-like,另一种是func-like。这两者最大的区别就是obj-like没有括号,没有变量。而func-like有括号,有变量。平时写代码的时候常用的是前一种,代码一般为。另一种写在后面,当然这里写的第二种宏的计算方式实际上是错误的,很脆弱。
#define SSL_OK 1
#define ABS(x) x>0?x;0-x
如何展开宏?
如何展开obj-like宏?
obj-like宏展开时为深度优先展开方式,即层层到底,再不断返回的展开方式。但是有一点需要依据,就是当前层次已经展开的宏不再展开第二次。
如何展开func-like宏?
func-like的宏展开时和obj-like的宏稍微不一致,首先第一点要记得:深度优先!func-like除了上面这点意外遵循下面的流程:
- 首先要完全展开参数,注意如果该宏由 #/##调用,就不会展开这个宏
- 将当前展开的参数代替 替换列表的内容
- 执行#/##的结果
- 重新扫描替换的结果,同时检查是否可替换
- 上面的过程中,不可展开的列表与obj-like的一样。
宏得陷阱
陷阱一:宏不是函数
作为C语言中一种很特殊的存在,宏有其自身的陷阱。宏本身相当于一个当前代码的完全展开。因此如果诸如++i/i++之类的代码的位置出现在宏展开的结果当中两次的地方,那么++i/i++就会被计算两次,带入副作用。此外,宏如果嵌套宏,那么完全展开的结果就太大了!
陷阱二:宏不是语句
结尾的闲言碎语
写到这里差不多就可以结束了,就不多说了。TLS这块还有啥不明白的直接告诉我就成了