Реализация if-else с препроцессором C - PullRequest
0 голосов
/ 23 мая 2019

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

...