[P&AM Lab] crypti printf questions

Grigoriy A. Sitkarev sitkarev на komitex.ru
Пн Апр 15 21:59:43 MSK 2013


Всем здоровья!

lonely.ruyk wrote:
> Небольшой вопрос по поводу va_list:
> Сейчас интерфейс функции форматированного вывода выглядит так:
> 
> int var_print_formatted(struct variable *fmt, struct variable **args,
> int nargs);
> 
> хотелось бы сделать чтобы она выглядела как то так
> 
> int var_print_formatted(struct variable *fmt, va_list ap);
> или так
> int var_print_formatted(struct variable *fmt, ...);
> 

Я думаю, что тебе не совсем понятно, откуда вообще взялся va_list и 
сопровождающие его макросы va_start(), va_end(), va_copy() и va_arg(). 
Они появились для того, чтобы обеспечить переносимость Си функций, 
принимающих переменное количество аргументов, с одной машины на другую, 
без привязок к особенностям ABI.

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

Чем плох нынешний вариант с передачей аргументов в массиве? В конце 
концов, кто запрещает сделать структуру

struct arg_list {
	const struct variable **item;
	int	nitems;
	int	nalloc;
};

int var_print_formatted(const struct variable *fmt, const struct 
arg_list *args);


--
Г.А.



Подробная информация о списке рассылки Lab