我一直在尝试编写一个C宏,该宏将条件作为输入,并且仅在该条件评估为true时才输出某些内容。
使用http://jhnet.co.uk/articles/cpp_magic中的构造,我尝试实现一个更简单的版本,其中始终会有一个输出值,但是根据条件的评估方式而有所不同。我使用了该文章中的IF_ELSE宏:
#define SECOND(a, b, ...) b
#define IS_PROBE(...) SECOND(__VA_ARGS__, 0)
#define PROBE() ~, 1
#define CAT(a,b) a ## b
#define NOT(x) IS_PROBE(CAT(_NOT_, x))
#define _NOT_0 PROBE()
#define BOOL(x) NOT(NOT(x))
#define IF_ELSE(condition) _IF_ELSE(BOOL(condition))
#define _IF_ELSE(condition) CAT(_IF_, condition)
#define _IF_1(...) __VA_ARGS__ _IF_1_ELSE
#define _IF_0(...) _IF_0_ELSE
#define _IF_1_ELSE(...)
#define _IF_0_ELSE(...) __VA_ARGS__
对于简单的整数输入,这确实足够:
IF_ELSE(0)(1)(0)
和
IF_ELSE(0x7F)(1)(0)
分别评估为0和1。
但是:
IF_ELSE(6 < 7)(1)(0)
和
IF_ELSE(6 > 7)(1)(0)
均为输出1,大概是因为在两种情况下均将〜运算符应用于6。恐怕这种宏魔术水平与我之前在预处理器上尝试过的一切相比还有很长的路要走,而且我还没有办法自己解决这个问题。有人可以帮忙吗?