Передача переменных-переменных в другую функцию, которая принимает список переменных-переменных

Итак, у меня есть 2 функции, которые имеют схожие аргументы

void example(int a, int b, ...);
void exampleB(int b, ...);

Теперь пример вызывает exampleB , но как я могу передать переменные в списке аргументов переменных без изменения exampleB (поскольку это уже используется и в других местах).

101
задан Sunchock 29 June 2018 в 00:48
поделиться

5 ответов

Вы не можете сделать это напрямую; вам нужно создать функцию, которая принимает 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...
}
114
ответ дан 24 November 2019 в 04:43
поделиться

На основе комментария, который вы обертываете vsprintf и помечен как C ++, я бы посоветовал не пытаться делать это, а изменить свой интерфейс на вместо этого используйте iostreams C ++. У них есть преимущества перед строкой функций print , такие как безопасность типов и возможность печатать элементы, которые printf не сможет обработать. Некоторая переделка сейчас может сэкономить значительную часть боли в будущем.

0
ответ дан 24 November 2019 в 04:43
поделиться

вы должны создать версии этих функций, которые принимают va_list и передавать их. Взгляните на vprintf в качестве примера:

int vprintf ( const char * format, va_list arg );
15
ответ дан 24 November 2019 в 04:43
поделиться

Используя новый стандарт C ++ 0x, вы можете сделать это с помощью вариативных шаблонов или даже преобразовать этот старый код в новый синтаксис шаблона, ничего не нарушая.

-1
ответ дан 24 November 2019 в 04:43
поделиться

Между прочим, многие реализации 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 (и любой механизм настройки, который она использует), ее можно расширить всевозможными вариациями.

2
ответ дан 24 November 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: