使用运行时值对宏进行字符串化

时间:2019-01-14 09:20:58

标签: c++ macros c++17

我想打印一个内部带有运行时值的宏。这可能吗?如果可以,怎么办?

#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 :(得分:1)

我认为您无法使用所需的语法来完成所需的操作(预处理器只是没有必要的自省功能)。

我认为您更有可能在某种表达模板系统上取得成功,您可以在其中编写如下内容:

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

然后可以写:

doSomething.generate(arg);

doSomething.print(arg)

警告:我很确定上面的确切语法将不起作用-但这是一个开始的地方。 (我建议您看一下Boost.Proto,但很可能还有其他合适的库。)