Как пройти через va_list, если количество аргументов неизвестно? - PullRequest
10 голосов
/ 26 января 2011

Как мне перебрать va_list, если количество дополнительных аргументов неизвестно?

#include <stdio.h>
#include <stdarg.h>

int add(int x, int y, ...) {
    va_list intargs;
    int temp = 0;

    va_start(intargs, y);
    int i;
    for (i = 0; i < 3; i++) { /* How can I loop through any number of args? */ 
        temp += va_arg(intargs, int);
    }
    va_end(intargs);

    return temp + x + y;
}

int main() {
    printf("The total is %d.\n", add(1, 2, 3, 4, 5));
    return 0;
}

Ответы [ 5 ]

18 голосов
/ 26 января 2011

При использовании списков аргументов переменной длины вы должны как-то указать количество параметров (если вы пишете переносимый код). Возможно, вы сейчас думаете: «Но printf не требует от вас указывать несколько аргументов!»

True, однако число можно определить, предварительно проанализировав строки формата для спецификаторов формата%.

15 голосов
/ 26 января 2011

Используйте значение часового в качестве терминатора, например, NULL или -1

2 голосов
/ 26 января 2011

Вы, вероятно, хотите сделать что-то вроде передачи числа аргументов в качестве первого параметра.

Например, смотрите здесь: http://www.cplusplus.com/reference/clibrary/cstdarg/va_start/

И еще обсуждение здесь: http://www.learncpp.com/cpp-tutorial/714-ellipses-and-why-to-avoid-them/

Переменные аргументы могут быть опасными, поэтому, если это вообще возможно, я постараюсь их избежать.Передача «векторного» типа, который включает размер и указатель на массив элементов, будет более безопасным.

1 голос
/ 03 апреля 2019

Два ответа выше, которые предлагают добавить первый аргумент, чтобы указать количество аргументов, которые не имеют смысла: количество аргументов неизвестно.

Использование значения дозорного (или ряда значений дозорного) в конце - единственный способ решить проблему.

0 голосов
/ 25 августа 2018

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

Вот типичный вызов:

int i = add(5, 20, 30, 40, 50, 60);

Сумма состоит из 5 чисел, поэтому первый параметр - 5 .Тогда остальные 5 чисел, которые нужно сложить.

Функция будет тогда:

int add(int argc, ...)
{
    int result = 0;
    va_list ptr;
    va_start(ptr, argc);

    for (int i = 0; i < argc; i++)
    {
        result += va_arg(ptr, int);
    }
    return result;
}

Ссылки:

va_arg()

va_start ()

va_list ()

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