Макрос Stringify со значениями времени выполнения - PullRequest
0 голосов
/ 14 января 2019

Я хотел бы напечатать макрос со значением времени выполнения внутри. Возможно ли это, и если да, то как?

#include<iostream>
#define DOSOMETHING(value) 5 * value + 6;

#define STRINGIFY(macro, arg1) std::cout << macro( << arg1<< );

int main(int argc, char** argv) 
{
    STRINGIFY(DOSOMETHING, argc)
    return 0;
}

Это должно вывести «5 * (значение argc) + 6», так что если argc равно 0, то выведите «5 * 0 + 6»

Как это можно сделать?

Код, который требуется после расширения макроса:

int main(int argc, char** argv) 
{
    std::cout << "5 * " << argc << " + 6";
    return 0;
}

Смысл в том, чтобы разрешить создание генератора кода на c ++ без необходимости генерации всего кода в строках, что отключает подсветку синтаксиса и делает его очень трудным для тестирования.

1 Ответ

0 голосов
/ 14 января 2019

Я не думаю, что вы можете делать то, что вы хотите с синтаксисом, который вы хотите (препроцессор просто не имеет необходимых возможностей для самоанализа).

Я думаю, что у вас больше шансов на успех с какой-нибудь системой шаблонов выражений, где вы можете написать что-то вроде:

auto doSomething = Magic(5) * Magic::arg + 6;

тогда можно написать:

doSomething.generate(arg);

или

doSomething.print(arg)

ВНИМАНИЕ: Я почти уверен, что приведенный выше синтаксис не сработает, но это отправная точка, на которую стоит обратить внимание. (Я бы посоветовал взглянуть на Boost.Proto, но вполне могут быть и другие подходящие библиотеки.)

...