gpt4 book ai didi

c++ - 在运行时使用动态参数调用 printf

转载 作者:行者123 更新时间:2023-11-28 04:25:51 26 4
gpt4 key购买 nike

我尝试用 C++ 为 printf 编写一个包装器。当然,我找到了 va_list 但不知道它对我有何适用,因为不会直接调用包装器。我稍后会展示。

我解析了一个脚本,其中包含一个参数数量未知的函数,例如

ASTNode node(Token(PRINT, PRINT));
consume(PRINT);
consume(LPAREN);
node.make_child(variable()); // <-- formatstring (node.child[int])
while(current_token._type() != RPAREN) {
consume(COMMA);
node.make_child(variable()); // <-- the values to replace in formatstring (node.child[int++])
i++;
}
consume(RPAREN);
return node;

第一个将是格式字符串,其他将是格式字符串中要替换的值,因此我执行它的函数看起来像

if(node._token()._type() == PRINT) {
Token formatstring = visit(*node.child[0]);
Token temp;
int i = 1;
while(i < node.child.size()) {
visit(*node.child[i++]); // <-- the values to replace in formatstring
}
}

并且不采用任何“真实”参数。如何使用 va_list 或其他方法构建动态参数数组?

谢谢

编辑 似乎有人不清楚我的问题..

printf 被称为 printf(formatstring, param1, param2, param3...) 我想构建在循环中第一个参数(formatstring)之后传递的参数,如

// Pseudocode
out("printf(");
out($myformatstring);
int i = 1;
while(i<parameter_count) {
out(parameter[i++]);
out(",");
}
out(")");

最佳答案

据我了解,您有给定的格式字符串和“读取/解析”参数。

你有两个问题要处理,处理格式和使用正确的参数类型。

printf 系列不支持部分替换(例如与 Qt 相反,它允许 QString("%1 %2").arg("Hello")生成允许链接的 QString("Hello %2")

所以你必须手动解析完整的格式字符串:

  • 打印常规字符。
  • 遇到%时,获取flag格式(除非是%%,那样直接显示%) .

  • 从标志格式,切换到适当的转换,比如

     // flagFormat would "simply" be %i, %010d, %4.2f or %+.0e
    switch (format_type) {
    case EFormatType::String: // %s
    printf(flagFormat, to_string(args[i]).c_str()); break;
    case EFormatType::Int: // %i, %d
    printf(flagFormat, to_int(args[i])); break;
    case EFormatType::String: // %f, %F, %e, %g, %
    printf(flagFormat, to_double(args[i])); break;
    // ...
    }
    ++i;

关于c++ - 在运行时使用动态参数调用 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54366443/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com