Перейти к содержанию

Количество аргументов в va_list


Гость

Рекомендуемые сообщения

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

Ссылка на комментарий
Поделиться на другие сайты

(может я не совсем понял вопрос) Использовать строку формата как первую переменную. Вот пример из мана:

void foo(char *fmt, ...) {
   va_list ap;
   int d;
   char c, *p, *s;
   va_start(ap, fmt);
   while (*fmt)
     switch(*fmt++) {
        case 's':           /* строка */
           s = va_arg(ap, char *);
           printf("строка %s\n", s);
        break;
        case 'd':           /* целое */
           d = va_arg(ap, int);
           printf("целое %d\n", d);
        break;
        case 'c':           /* символ */
             /* необходимо указание типов, т.к. va_arg
                воспринимает только полностью определенные типы */
             c = (char) va_arg(ap, int);
             printf("символ %c\n", c);
         break;
     }
   va_end(ap);
}
Ссылка на комментарий
Поделиться на другие сайты

Нет, имеется в виду, если первый аргумент - не форматная строка,

int, например. Допустим, имеется функция вида:

func (int xxx, [yyy, zzz]).

Если надо в функции выполнять какие - то действия в зависимости от значений yyy или zzz, то неплохо бы определить, были ли они переданы в функцию. Если просто использовать их, не зная, были ли они переданы, то вместо их значений получается какой - то хлам. Если получается yyy == 5, то я не знаю, было ли передано 5 или оно уже лежало в стеке...

Ссылка на комментарий
Поделиться на другие сайты

Почему бы не сделать так:

int func(int xxx, int yyy, int zzz)
{
    if (yyy == -1 || zzz == -1)
        bla_bla_bla();
}

int func(int xxx)
{
    func(xxx, -1, -1); // "-1" - для примера
}

Хотя наверняка есть более человеческий способ. Кстати, по-моему, в Linux аргументы передаются не через стек, а через регистры.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...