Используйте функцию vararg в функции vararg - PullRequest
1 голос
/ 06 мая 2020

Я хочу вызвать функцию Variadi c в функции Variadi c. Код не выдает ошибки, но полученные значения неверны. Как правильно это сделать?

#include <stdarg.h>

void SecondFunction (int count, ...) {
    va_list args;
    va_start(args, count);
    AddValues(count, args);
    va_end(args);
};

void AddValues(int count, ...) {
   va_list args;
   va_start(args, count);

   for(int i=count; i--; )
      processItem(va_arg(args, void*));

   va_end(args);
}

Ответы [ 2 ]

5 голосов
/ 06 мая 2020

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

void vAddValues(int count, va_list args) {
    int i;
    for (i = count; i--; )
        processItem(va_arg(args, void *));
}
3 голосов
/ 06 мая 2020

Прочтите более внимательно stdarg (3) или стандарт C11 n1570 и документацию по вариади c функциям в C.

Вам необходимо использовать va_list и, возможно, va_copy

Прочтите также о соглашениях о вызовах вашей конкретной реализации C. Существует подробная страница в Википедии о соглашениях о вызовах x86 , которые мотивируют формулировку стандарта.

Для вдохновения посмотрите на такие функции, как vprintf (3) . В практике вам должна быть интересна их реализация в open source C стандартных библиотеках таких как musl-lib c.

Теоретически (и в реальной жизни, в некоторых случаях на Linux с недавним G CC, как встроенным) vprintf может быть реализовано в компиляторе. Но поскольку вы можете взять его адрес и передать его какой-либо функции, он также должен быть функцией из стандартной библиотеки C.

...