在实现not_equal的过程中,利用宏展开不能重入的特性,从而把x和y在相等和不相等的时候映射成不同的宏,再通过把这些宏的值定义成0或1来实现最终的not_equal判断。
#define TL_NOT_EQUAL_0(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
#define TL_NOT_EQUAL_1(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
#define TL_NOT_EQUAL_2(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
#define TL_NOT_EQUAL_3(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
#define TL_NOT_EQUAL_4(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
#define TL_NOT_EQUAL_5(c, y) TL_IIF(c, TL_NIL, y(1, TL_NIL))
定义一系列的宏,TL_NOT_EQUAL_xxx。
用下面的方式调用上面的宏:
TL_NOT_EQUAL_##x(0, TL_NOT_EQUAL_ ## y)
如果x和y相同,举例如果x和y都是2,当用TL_NOT_EQUAL_2(0,TL_NOT_EQUAL_2) 展开后会变成TL_NOT_EQUAL_2(1,TL_NIL)。如果x和y相同展开后结果为TL_NIL
注意:这个地方利用宏展开的一个特性,宏展开遇到同名的宏,会停止展开(可以参看宏元编程)。
然后再把TL_NIL和TL_NOT_EQUAL_2(1,TL_NIL)映射0或1就能判断两个值是否相同。下面是具体实现:#define TL_NOT_EQUAL_I(x, y) TL_CAT(TL_NOT_EQUAL_CHECK_, TL_CAT(TL_NOT_EQUAL_,x)(0, TL_NOT_EQUAL_ ## y))
#define TL_NOT_EQUAL_CHECK_TL_NIL 1
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_0(c, y) 0
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_1(c, y) 0
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_2(c, y) 0
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_3(c, y) 0
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_4(c, y) 0
#define TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_5(c, y) 0
如果x和y相等,TL_NOT_EQUAL_I(x, y)的最终结果是TL_NOT_EQUAL_CHECK_TL_NOT_EQUAL_x(1, TL_NIL),这些宏值都被定义成0
如果x和y不相等TL_NOT_EQUAL_I(x, y)的最终结果是TL_NOT_EQUAL_CHECK_TL_NIL,值为1