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