【发布时间】:2020-02-17 04:22:40
【问题描述】:
我想要一个宏,它可以执行以下操作:
#define TEST(_ptr) ({ if ((_ptr) == NULL) ERROR; (_ptr); })
检查_ptr 并调用ERROR 宏或返回其值。
但是,如果我使用 var = TEST(fun()) 之类的东西,这会导致 fun() 被调用两次。
我可以这样做:
#define TEST(_tmp, _ptr) ({ _tmp = _ptr; if ((_tmp) == NULL) ERROR; (_tmp); })
是否有任何干净的方法可以在不通过临时存储的情况下执行此操作,例如使用typeof 运算符!?
【问题讨论】:
-
请注意,expression statements 是标准 C 的 GCC 扩展,
typeof运算符也是如此。只要您意识到您正在创建的可移植性问题,就可以使用它们。 -
使用8字节的临时存储有什么问题?您的机器没有那么拥挤的内存。