Я видел ответы здесь на вопросы о том, как передавать переменные аргументы от одной функции к другой, которые говорят, что va_list переходит к второй функции. Отлично, когда я это пробовал, va_start не нравится, когда переданный в va_list передан...
void foo(const char *str, va_list args) {
va_start(args, str);
//do something
va_end(args);
}
void foo(const char *str, ...) {
va_list args;
foo(str, args);
}
Я получаю эту ошибку от g++:
error: 'va_start used in function with fixed args
Этот код вызывает неопределенное поведение, поскольку вы использовали args
инициализированные в foo
. Правильный способ:
void foo(const char *str, va_list args) {
//do something
}
void foo(const char *str, ...) {
va_list args;
va_start(args, str);
foo(str, args);
va_end(args);
}
Вам нужно вызвать va_start
в вашей вариационной функции. То же самое для va_end
:
void foo (const char * str, va_list args )
{
/* ... */
}
void foo (const char * str, ... )
{
va_list args;
va_start( args, str );
foo( str, args );
va_end( args );
}