Я пытался написать макрос C, который бы принимал условие в качестве входных данных и выводил что-то, только если это условие оценивалось как истинное.
Используя конструкции из 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 в обоих случаях.Боюсь, что этот уровень макромагии намного превосходит все, что я пробовал раньше с препроцессором, и я не смог найти способ решить это самостоятельно.Кто-нибудь может помочь?