Для компиляции на основе результата модуля с двумя случайными числами нам нужно будет использовать BoostPP .
#include <boost/preprocessor/control/if.hpp>
#include <boost/preprocessor/arithmetic/mod.hpp>
BOOST_PP_IF(BOOST_PP_MOD(RAND, 2), printf("A"); printf("B");)
И вам нужно будет скомпилировать, используя-D
опция для присвоения RAND
из /dev/random
, как предложено вам в комментарии.
Вот некоторые подробности реализации условного макроса, чтобы дать вам представление о том, как он работает.Операция модуля требует реализации типов данных и операций над ними, что слишком долго, чтобы демонстрировать здесь.
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__
#define COMPL(b) PRIMITIVE_CAT(COMPL_, b)
#define COMPL_0 1
#define COMPL_1 0
#define CHECK_N(x, n, ...) n
#define CHECK(...) CHECK_N(__VA_ARGS__, 0,)
#define PROBE(x) x, 1,
#define NOT(x) CHECK(PRIMITIVE_CAT(NOT_, x))
#define NOT_0 PROBE(~)
#define BOOL(x) COMPL(NOT(x))
#define IIF(c) PRIMITIVE_CAT(IIF_, c)
#define IIF_0(t, ...) __VA_ARGS__
#define IIF_1(t, ...) t
#define IF(c) IIF(BOOL(c))
#define EAT(...)
#define EXPAND(...) __VA_ARGS__
#define WHEN(c) IF(c)(EXPAND, EAT)
И использование.Обратите внимание, что WHEN(0)
не расширяется, и любой другой WHEN(arg)
будет расширяться.
WHEN(0) ( \
printf("A"); \
)
WHEN(1) ( \
printf("B"); \
)
WHEN(whatever) ( \
printf("this will expand too"); \
)
Извлеките краткое введение в CPP высокого уровня вместе с источником длямакросы в этом примере для более подробной информации о макросах выше.