vsprintf,如何在linux上将void **转换为va_list

时间:2012-07-27 15:40:54

标签: c printf

我对vsprintf的问题是我无法直接获取输入参数,我必须先逐个获取输入并将其保存在void**中,然后将此void**传递给{ {1}},对于windows来说一切都很好,但是当我来到64位linux时,gcc无法编译,因为它不允许从vsprintf()转换为void**,有没有人可以给我一些帮我在linux下怎么做?

我的部分代码是:

va_list

非常感谢!!

1 个答案:

答案 0 :(得分:1)

问题是,您的函数获得...,但您传递的是va_list...用于这样的用法:

 getInputArgs(s, formatString, arg1, arg2, arg3, arg4 /* etc */);

,它不适用于va_list。不幸的是,没有一种简单的方法可以从不同的参数创建va_list,而不是从...获取它。例如,请参阅this question

你应该做的是改变你想要打印到字符串的方式。

你可以:

char s[256];
int so_far = 0;

在你的for循环中,而不是像这样的东西:

CopyInDoubleArg(i, TRUE, &tempValue);   //lib func
args_ptr[i-2] = (void*) (int)tempValue;

你写道:

CopyInDoubleArg(i, TRUE, &tempValue);   //lib func
if (so_far < 256)  /* 256 is the maximum length of s */
    so_far += snprintf(s + so_far, 256 - so_far, "%lf", tempValue);

这些方面的东西。这样,您可以逐个创建字符串,将每个元素追加到上一个元素,而不是尝试一次完成所有元素。