Итак, у меня есть 2 функции, которые имеют схожие аргументы
void example(int a, int b, ...);
void exampleB(int b, ...);
Теперь пример
вызывает exampleB
, но как я могу передать переменные в списке аргументов переменных без изменения exampleB
(поскольку это уже используется и в других местах).
Вы не можете сделать это напрямую; вам нужно создать функцию, которая принимает va_list
:
#include <stdarg.h>
static void exampleV(int b, va_list args);
void exampleA(int a, int b, ...) // Renamed for consistency
{
va_list args;
do_something(a); // Use argument a somehow
va_start(args, b);
exampleV(b, args);
va_end(args);
}
void exampleB(int b, ...)
{
va_list args;
va_start(args, b);
exampleV(b, args);
va_end(args);
}
static void exampleV(int b, va_list args)
{
...whatever you planned to have exampleB do...
...except it calls neither va_start nor va_end...
}
На основе комментария, который вы обертываете vsprintf
и помечен как C ++, я бы посоветовал не пытаться делать это, а изменить свой интерфейс на вместо этого используйте iostreams C ++. У них есть преимущества перед строкой функций print
, такие как безопасность типов и возможность печатать элементы, которые printf
не сможет обработать. Некоторая переделка сейчас может сэкономить значительную часть боли в будущем.
вы должны создать версии этих функций, которые принимают va_list и передавать их. Взгляните на vprintf
в качестве примера:
int vprintf ( const char * format, va_list arg );
Используя новый стандарт C ++ 0x, вы можете сделать это с помощью вариативных шаблонов или даже преобразовать этот старый код в новый синтаксис шаблона, ничего не нарушая.
Между прочим, многие реализации C имеют внутреннюю вариацию v? Printf, которая, IMHO, должна была быть частью стандарта C. Точные детали различаются, но типичная реализация будет принимать структуру, содержащую указатель на функцию вывода символов и информацию о том, что должно произойти. Это позволяет printf, sprintf и fprintf использовать один и тот же «основной» механизм. Например, vsprintf может выглядеть примерно так:
void s_out(PRINTF_INFO *p_inf, char ch) { (*(p_inf->destptr)++) = ch; p_inf->result++; } int vsprintf(char *dest, const char *fmt, va_list args) { PRINTF_INFO p_inf; p_inf.destptr = dest; p_inf.result = 0; p_inf.func = s_out; core_printf(&p_inf,fmt,args); }
Затем функция core_printf вызывает p_inf-> func для каждого выводимого символа; функция вывода может затем отправить символы на консоль, в файл, строку или что-то еще. Если какая-либо реализация предоставляет функцию core_printf (и любой механизм настройки, который она использует), ее можно расширить всевозможными вариациями.