我正在尝试转换一些代码,以便它也可以在 gcc 上编译(现在,它只能在 MSVC 上编译)。
我遇到的代码是一个伪格式函数,它接受格式字符串和零个或多个参数 ( const char *format, ...
) 作为输入。然后它将处理一些占位符,消耗一些参数,并将其余部分vsprintf
与动态生成的新 va_list 一起传递。
这是生成新的实际代码va_list
:
char *new_args = (char *) malloc(sum);
char *n = new_args;
for(int i = 0; i < nArgs; i++)
{
int j = order[i];
int len = _getlen(types[j]);
memcpy(n, args + cumulOffsets[j], len);
n += len;
}
vsprintf(buffer, sFormat.c_str(), new_args);
在我的辩护中,我没有也永远不会编写这段代码。事实上,我认为这是我一生中见过的最骇人听闻的事情之一。
但是,这个功能非常复杂,非常古老,而且非常重要。它也多年来没有被修改过(嗯,除了现在),所以虽然我想从头开始重写它,但我无法证明它所花费的时间加上它会引入的错误是合理的。
所以,我需要一种方法在 GCC 上做同样的事情。但是va_list
没有 achar *
所以我得到:
错误:ISO C++ 禁止转换为数组类型“__va_list_tag [1]”