C vfprintf функция не работает со строковыми аргументами - PullRequest
1 голос
/ 07 октября 2011

Я пытаюсь использовать vfprintf следующим образом
vfprintf (fp, buffer, arg);Файл журнала fp, который я создаю, используя дату и время запуска, буфер и остальные аргументы

fp = fopen(filename, "a");
va_start(arg, message);
vprintf(message, arg); // print stdout
vfprintf(fp, buffer, arg); // print to file
va_end(arg);
fclose(fp);

, он отлично работает с числами и ужасно умирает с ошибкой: источник vfprintf не найден в....

Кто-нибудь знает, что я делаю неправильно, случайно?

1 Ответ

3 голосов
/ 07 октября 2011

Вероятно, вы используете 64-битную архитектуру, в которой переменную длину arg можно передать только один раз.Чтобы сделать больше проходов, скопируйте arg, используя va_copy():

va_list arg, arg2;
va_start(arg, message);
va_copy(arg2, arg);
vprintf(message, arg); // print stdout
va_end(arg);
vfprintf(fp, buffer, arg2); // print to file
va_end(arg2);

From man va_arg:

Макрос va_arg () раскрывается в выражение, имеющее тип изначение следующего аргумента в вызове.Аргумент ap - это va_list ap, инициализированный va_start (). Каждый вызов va_arg () изменяет ap так, чтобы следующий вызов возвращал следующий аргумент. Тип аргумента - это имя типа, указанное так, чтобы можно было получить тип указателя на объект, имеющий указанный тип.просто добавив * к типу.

...

Если ap передается в функцию, которая использует va_arg (ap, type), тогда значение ap не определено послевозврат этой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...