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