Можно ли обработать математические вычисления перед тем, как максимизировать макрос?

Я просматриваю много примеров в Интернете о строжайшей макросов, но не могу найти что-то подобное.

В настоящее время у меня есть определения, как показано ниже.

#define PIN_A (0+1)
#define PIN_B (0+2)
#define PIN_C (0+3)
#define str(x) #x
#define xstr(x) str(x)
#define PIN_DEF(x) { #x, xstr(PIN_ ## x) }

Выход из

PIN_DEF(A)

станет

{ "A", "(0+1)" }

Однако, что мне действительно нужно, так это

{ "A", "1" }

Это вообще возможно?:/

1 ответ

Да, это возможно.

#include <boost/preprocessor/arithmetic.hpp>
#define PIN_A BOOST_PP_ADD(0,1)
#define PIN_B BOOST_PP_ADD(0,2)
#define PIN_C BOOST_PP_ADD(0,3)
#define str(x) #x
#define xstr(x) str(x)
#define PIN_DEF(x) { #x, xstr(PIN_##x) }

PIN_DEF(A)

Имейте в виду, что арифметические макросы препроцессора ускоряются при 256,

Предостережения

Препроцессор также может оценивать выражения, но единственный способ сделать это - вызвать условные директивы препроцессора (такие как #if <выражение>/#elif <выражение>). Из этого можно сделать полезный анализатор выражений с ограничениями на использование, но он не подходит для этого варианта использования. Макро математика должна быть адаптирована к использованию макросов (и, по сути, реализована с нуля), поэтому операции должны быть реализованы в терминах вызовов макросов.

Другие вопросы по тегам