Как создать va_list в GCC?

Я пытаюсь преобразовать некоторый код, чтобы он тоже компилировался на 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);

В свое оправдание я не сделал этого. t и никогда не напишет этот код. Фактически, я думаю, что это одна из самых хакерских вещей, которые я видел за всю свою жизнь.

Однако эта функция очень сложная, очень старая и очень важная. Он также не изменялся годами (ну, кроме сейчас), поэтому, хотя я хотел бы переписать его с нуля, я не могу оправдать время, которое потребуется, плюс ошибки, которые он внесет.

Итак, мне нужно способ сделать то же самое в GCC .. Но там va_list не является char * , поэтому я получаю:

error: ISO C++ forbids casting to an array type '__va_list_tag [1]'
7
задан frm 26 December 2010 в 19:10
поделиться