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