gpt4 book ai didi

c - 填充 va_list

转载 作者:太空狗 更新时间:2023-10-29 16:24:30 24 4
gpt4 key购买 nike

有没有办法从头开始创建 va_list?我正在尝试调用一个将 va_list 作为参数的函数:

func(void **entry, int num_args, va_list args, char *key); 

...来自不接受可变数量参数的函数。我能想到的唯一方法是创建一个采用可变参数然后传递其 va_list 的中间函数,这是非常愚蠢的:

void stupid_func(void **entry, char *key, int num_args, ...) {
va_list args;
va_start(args, num_args);

func(entry, num_args, args, key);

va_end(args);
}

有没有更好的方法?我无法更改 func 的签名。

最佳答案

这是一个坏主意,因为 va_list 抽象用于隐藏一些严酷编译器/体系结构特定细节,如堆栈指针等。一旦初始化,它就几乎绑定(bind)到函数的范围。如果你绕栈并在范围外引用之前的帧 va_args,事情就会变糟。你可以传递它们,但是......

预计会出现错误

参见:http://lists.freebsd.org/pipermail/freebsd-amd64/2004-August/001946.html

还检查 man(3) va_copy 和 friend ,以更安全处理 va_args 并传递它们。

恕我直言,va_args 的东西不是很整洁。过去,我通过在堆上初始化结构/不透明指针然后使用指针算法来处理数据来处理这个问题。但这是一个 hack,取决于具体情况。

关于c - 填充 va_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/988290/

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