2010-05-07 4 views
0

Я хотел бы иметь функцию, которая будет принимать в качествепеременный список аргументов в окнах va_list

foo(...) 
{ 
    //...... 
} 

использования этого было бы

foo(1,2,3); 
foo(1) 
foo(1,2,3,4,5,5,6); 

va_list может быть использован, но снова, что я должен пройти foo(int count, ...) , так как это во время выполнения, я не знаю, сколько аргументов у меня есть.

любой указатель был бы оценен

Благодаря

+1

C++ 0x делает это ... ну, не проще, но лучше. Но поддержка по-прежнему неровная. –

ответ

3

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

2

Функции Variadic в C и C++ не относятся к типу. Таким образом, вы не можете делать то, что хотите, без . механизм для маркировки конца списка аргументов. Вам также необходимо иметь хотя бы один «фиксированный» аргумент, чтобы макросы могли знать, где находится начало списка ваших аргументов.

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

Обратите внимание, что он работает нормально для таких вещей, как printf, потому что строка формата является фиксированным параметром, а «count» вариационного аргумента неявна в строке формата.

1

Это не возможно построить список аргументов во время выполнения в C, так что абсолютно уверен, что вы знаете, сколько аргументов каждый вызов f() используется во время компиляции.

Смежные вопросы