使用运行时值字符串化宏

Stringify macro with runtime values

本文关键字:字符串 运行时      更新时间:2023-10-16

我想打印一个包含运行时值的宏。这是否可能,如果可能,如何?

#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++ 代码生成器,而无需在字符串中生成所有代码,这会禁用语法突出显示并使其非常难以测试。

我不认为你可以用你想要的语法做你想做的事(预处理器只是没有必要的内省功能)。

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

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

然后可以写:

doSomething.generate(arg);

doSomething.print(arg)

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