Гость Опубликовано 26 ноября, 2004 Жалоба Опубликовано 26 ноября, 2004 Как определить, какие значения были переданы в va_arg, если не известно количество аргументов в va_list, или как определить количество аргументов? Цитата
EL[michlen] Опубликовано 27 ноября, 2004 Жалоба Опубликовано 27 ноября, 2004 (может я не совсем понял вопрос) Использовать строку формата как первую переменную. Вот пример из мана: 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); } Цитата
Гость Опубликовано 29 ноября, 2004 Жалоба Опубликовано 29 ноября, 2004 Нет, имеется в виду, если первый аргумент - не форматная строка, int, например. Допустим, имеется функция вида: func (int xxx, [yyy, zzz]). Если надо в функции выполнять какие - то действия в зависимости от значений yyy или zzz, то неплохо бы определить, были ли они переданы в функцию. Если просто использовать их, не зная, были ли они переданы, то вместо их значений получается какой - то хлам. Если получается yyy == 5, то я не знаю, было ли передано 5 или оно уже лежало в стеке... Цитата
EL[michlen] Опубликовано 5 декабря, 2004 Жалоба Опубликовано 5 декабря, 2004 Почему бы не сделать так: 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 аргументы передаются не через стек, а через регистры. Цитата
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.