c++ - 如何在 C++ 中建立一个 va_list

标签 c++ printf variadic-functions

我有一个具有不同类型和值的参数结构(这对我的问题来说并不重要):

enum class ArgType {...}

struct Argument
{
    ArgType type;
    void* value;
}

我有一个自定义动态 List 实现,用于创建 Argument 列表。然后我有以下函数可以接受这个列表,我的目标是遍历这个列表并构建一个 va_list:

void foo(List<Argument>* args)
{
    for (int i = 0; i < args->length; i++)
    {
        Argument* arg = args->get(i);
        char* value = (char*) value;
        // build a `va_list` from value
    }
}

然后我有一个名为 bar 的函数,它将使用 foo 函数构建一个 va_list,并打印一个格式化的字符串。

void bar(char* format_str, List<Argument>* args)
{
    // get va_list from: foo(args);
    vfprintf(stdout, format_str, argptr);
}

我将如何构建一个 va_list,或者制作类似 va_list 的东西,我仍然可以传递给 vfprintf

提前致谢。

最佳答案

va_list只是一个指向参数的指针,这些参数已被插入调用堆栈以用于函数 CALL操作说明。您的链表存在于内存中的其他地方。执行您要求的唯一方法是编写枚举列表并手动将值推送到调用堆栈的汇编代码。不要这样做,它高度依赖于编译器,甚至依赖于平台。

你甚至不应该使用 printf以 C++ 中的 -style 函数开始。请改用 I/O 流,例如 std::cout , std::ostringstream等。写一个 operator<<对于 Argument然后使用普通循环枚举列表并将其值写入所需的 std::ostream对象。

对于您的 bar()功能,你可以简单地拆分 format_str放入 token 列表,然后将每个 token 写入 std::ostream , 代替 Argument根据需要为“特殊” token 设置值。

或者,您可以去掉 bar()完全让调用者直接格式化它的 Arguments使用任何列表 std::ostream它想要。

关于c++ - 如何在 C++ 中建立一个 va_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48251604/

相关文章:

c - 过于频繁地打印文本?

c++ - 将 void* 转换为 std::string

c - 为什么调用 vprintf 或类似函数两次不起作用甚至出现段错误?

c++ - 如果我在构造函数中写return语句怎么办?

c++ - 指针说明

c++ - 我应该将 printf 与 std::cin 混合使用吗?

Smalltalk 可变参数函数

c++: #include 和不同的文件类型

C++ 对齐 new[]

php - 如何编写带有可选参数和可变长度参数的函数?