我有一个具有不同类型和值的参数结构(这对我的问题来说并不重要):
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/