va_list
这是一个奇怪的问题,但是在将 a 的内容传递给另一个函数之前,有没有一种标准的方法来操作它的内容?例如,假设我有两个函数,sum
并且vsum
:
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
as 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,因为将 2vsum_stub
中的所有值递增va_list
。这当然不会编译,因为您不能获取va_arg
. 还有另一种方法可以做到这一点吗?我在 C99 工作。
背景:
我正在开发一个库,该库进行一些指针转换,以便数据可以以更有效的格式存储在堆上。程序使用自定义转换进行编译,该转换将调用转换为库函数printf
,例如我自己的存根函数(例如hc_printf
)。在将参数传递给真正的函数之前,hc_printf
需要翻译任何指针参数(用于 的字符串) 。%s
printf
编辑:这是一个代码示例。假设我们有一个字符串foo
。foo
是动态分配的,修改后的版本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
可以使用的真实指针。