C语言宏的展开

C语言如何展开宏

Posted by 大狗 on September 15, 2020

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这块还有啥不明白的直接告诉我就成了 狗头的赞赏码.jpg