<HTML><BODY><p>Я подумал что с такой интерфейс выглядит более стандартным и каноничным.<br>В конечном итоге ведь и printf(3) функции могли реализовать как то вроде:<br>printf(char *fmt, void *args, int nargs).<br>Спасибо за ответ, наверное я действительно немного не прав относительно интерфейса функций.:)<br><br>А вообще есть возможность сделать преобразование array -> va_list или запихать массив в функции с переменным количеством параметров *стандартными средствами* или эта ситуация - совсем не то для чего они используются и о таких вопросах не стоит задумываться?<br><br><br>Понедельник, 15 апреля 2013, 21:59 +04:00 от "Grigoriy A. Sitkarev" <sitkarev@komitex.ru>:<br>
</p><blockquote style="border-left:1px solid #0857A6; margin:10px; padding:0 0 0 10px;" class="mailru-blockquote">
        <div id="">
        
        
        
        
        
        
        
        
<div class="js-helper js-readmsg-msg">
        
        <div id="style_13660488090000000757" class="mr_read__body">
                
                
                        <div id="style_13660488090000000757_BODY">Всем здоровья!<br>
<br>
lonely.ruyk wrote:<br>
> Небольшой вопрос по поводу va_list:<br>
> Сейчас интерфейс функции форматированного вывода выглядит так:<br>
> <br>
> int var_print_formatted(struct variable *fmt, struct variable **args,<br>
> int nargs);<br>
> <br>
> хотелось бы сделать чтобы она выглядела как то так<br>
> <br>
> int var_print_formatted(struct variable *fmt, va_list ap);<br>
> или так<br>
> int var_print_formatted(struct variable *fmt, ...);<br>
> <br>
<br>
Я думаю, что тебе не совсем понятно, откуда вообще взялся va_list и <br>
сопровождающие его макросы va_start(), va_end(), va_copy() и va_arg(). <br>
Они появились для того, чтобы обеспечить переносимость Си функций, <br>
принимающих переменное количество аргументов, с одной машины на другую, <br>
без привязок к особенностям ABI.<br>
<br>
В твоём случае мы имеем дело с интерпретатором, где сами переменные и <br>
аргументы при вызове функций хранятся некоторым образом в его состоянии <br>
времени выполнения. Сам интерпретатор может полностью контроллировать <br>
сколько значений было передано функции при вызове, поэтому необходимости <br>
в va_list для передачи аргументов никакой нет.<br>
<br>
Чем плох нынешний вариант с передачей аргументов в массиве? В конце <br>
концов, кто запрещает сделать структуру<br>
<br>
struct arg_list {<br>
        const struct variable **item;<br>
        int        nitems;<br>
        int        nalloc;<br>
};<br>
<br>
int var_print_formatted(const struct variable *fmt, const struct <br>
arg_list *args);<br>
<br>
<br>
--<br>
Г.А.<br>
<br>
_______________________________________________<br>
Lab mailing list<br>
<a href="sentmsg?compose&To=Lab@amplab.syktsu.ru">Lab@amplab.syktsu.ru</a><br>
<a href="http://amplab.syktsu.ru/cgi-bin/mailman/listinfo/lab" target="_blank">http://amplab.syktsu.ru/cgi-bin/mailman/listinfo/lab</a></div>
                        
                
                
        </div>
        
</div>
</div>
</blockquote><p>
<br></p></BODY></HTML>