gpt4 book ai didi

c - 操纵可变参数的标准方法?

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

这是一个奇怪的问题,但是在将 va_list 的内容传递给另一个函数之前,是否有一种标准的方法来操纵它?例如,假设我有两个函数,sumvsum:

int vsum(int n, va_list ap) {
int total = 0;
for (int i = 0; i < n; ++i) {
total += va_arg(n, int);
return total;
}

int sum(int n, ...) {
va_list ap;
va_start(ap, n);
int total = vsum(n, ap);
va_end(ap);
return total;
}

如果我将 sum 调用为 sum(4, 1, 2, 3, 4),我希望得到结果 10。现在让我们假设不是调用vsum 直接调用,sum 调用中间函数 vsum_stub,它执行以下操作:

int vsum_stub(int n, va_list ap) {
va_list temp_ap;
va_copy(temp_ap, ap);
for (int i = 0; i < n; ++i) {
int *arg = &va_arg(ap, int);
*arg += 2;
}
va_end(temp_ap);
return vsum(n, ap);
}

现在当我调用 sum(4, 1, 2, 3, 4) 时,我应该得到结果 20,因为 vsum_stub 递增了va_list 为 2。这当然不能编译,因为您不能获取 va_arg 结果的地址。还有另一种方法可以做到这一点吗?我在 C99 工作。


背景:

我正在开发一个可以进行一些指针转换的库,以便数据可以更有效的格式存储在堆上。程序是使用自定义转换编译的,该转换将对 printf 等库函数的调用转换为我自己的 stub 函数(例如,hc_printf)。在将参数传递给真正的 printf 函数之前,hc_printf 需要转换任何指针参数(用于 %s 的字符串)。

编辑:这是一个代码示例。假设我们有一个字符串 foofoo 是使用修改后的 malloc 动态分配的,它返回一个假指针。编译器修改程序,使其可以处理假指针。所以这有效:

char *foo = fake_malloc(4);
fake_strcpy(foo, "foo");

我想写一个这样的fake_vprintf函数(伪代码):

int fake_vprintf(const char *format, va_list args) {
for each pointer argument p in args
translate p to q, a real pointer to contiguous memory
replace p with q in args
}
return vprintf(format, args);
}

程序将调用 fake_vprintf 就像使用假指针的原始 vprintf 一样。 fake_vprintf 将假指针转换为真正的指针,真正的 vprintf 可以使用。

最佳答案

啊哈,据我了解,您的问题是创建一个新的 va_list 参数以传递给标准 vprintf 函数。反过来,这将要求您修改列表中的每个成员。但是,由于没有针对此类列表的元素明智的提取/编辑/插入操作,因此您陷入困境。

我真的看不出有什么办法可以做到这一点。当然,您可以创建一个 vprintf 就地 应用转换,一次一个参数。我的建议是:重新实现所有 此类标准库函数——无论如何您都在编写包装器。这涉及一些工作,但您已经使用 hc_printf 等完成了其中的一部分,所以为什么不走完全程(猜猜函数调用节省了什么!)。

关于c - 操纵可变参数的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2210379/

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