Как в С++ с помощью препроцессора посчитать и преобразовать в строку?

Подскажите как в С++ с помощью макросов сначала посчитать формулу, а результат преобразовать в строку? Например, есть


#define A 2

#define B 3


#define MUL(x,y) (x*y)

#define STR(x) #x


Как мне получить строку «6»? Естественно STR(MUL(A,B)) не работает.
  • Вопрос задан
  • 4361 просмотр
Решения вопроса 1
@mayorovp
Никак — препроцессор в принципе не выполняет арифметических действий. Разве что какое-нибудь лямбда-исчисление замутить…
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@vScherba
Хм, ну почему же нельзя?

#include <boost/preprocessor.hpp>
BOOST_PP_STRINGIZE(BOOST_PP_MUL(A, B))
Ответ написан
ixSci
@ixSci
Как Вам уже выше указали, макросы являют собой то, что вытекает из их имени — макроподстановку. То, чего Вы хотите добиться, в старых редакциях C++, решается шаблонами. В новой — constexpr.
Ответ написан
Комментировать
Gorthauer87
@Gorthauer87
Программист
Сами макросы конечно не вычисляют, но значение 3 + 3 таки вычисляется во время компиляции. Вот только строчку, где записано 6, из этого не сделаешь.
Ответ написан
Комментировать
coffeesmoke
@coffeesmoke
Выбирайте нужное
#include <QtCore>
#include <iostream>

using namespace std;

# define MULT(VAL1,VAL2) ((VAL1)*(VAL2))
# define AS_STR(NUM_VAL) ( QString("")+#NUM_VAL )
# define AS_STR_VAL(NUM_VAL) ( QString().sprintf("%d",NUM_VAL) )


int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  int i = MULT(1+2,1+1+1);
  cout << "Variant 1: " << qPrintable(AS_STR(i)) << endl;
  cout << "Variant 2: " << qPrintable(AS_STR(MULT(1+2,1+1+1))) << endl;
  cout << "Variant 3: " << qPrintable(AS_STR_VAL(MULT(1+2,1+1+1))) << endl;

  return a.exec();
}


Результат (консоль):

Variant 1: i
Variant 2: MULT(1+2,1+1+1)
Variant 3: 9
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы