Zalecana obsługa dowolnie długich list argumentów jest zaimplementowana w bibliotece stdarg:
#inlcude <stdarg.h>
lub
#inlcude <cstdarg>
Potrzebne makra:
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
Wywołaniu va_start musi odpowiadać va_end (jeden do jeden, najlepiej na początku i na końcu funkcji). Musimy z góry znać liczbę argumentów, np. przekazując ją jako jeden z parametrów (nazwanych) funkcji - najlepiej ostatni (jesli ktoś chce się dowiedzieć jak to jest, że w printf nie podajemy ilości elementów, niech przeczyta przykład z linku poniżej).
Aby uzyć va_start musimy najpierw zdefiniować zmienną typu va_list, która będzie trzymać dla nas strukturę (wskaźnik) naszej listy parametrów. Drugim parametrem va_start jest oststni znany, nazwany parametr funkcji, najczęsciej coś w stylu paramCount.
Następnie odpowiednią ilośc razy wywołujemy va_arg, jako pierwszy przekazując zmienną reprezentującą listę, ako drugi przekazujemy nazwę typu którego żądamy. Nazwa typu może być różna w każdym wywołaniu, jednak zazwyczaj ograniczamy się do jednego, dwóch typów (dla prostoty).
Przykład:
void foo(int a, int b, int paramCount, ...){
va_list ap;
va_start(va_list ap, paramCount);
for (int i = 0; i < paramCount; i++){
printf("%d, ", va_arg(ap, int));
}
va_end(ap);
}
Zakładam, że państwo już to lub cos podobnego wygoogle'ali, ale dla pełności zamieszczam: cplusplus.com reference to cstdarg.
A tutaj, gdyby kogoś ciekawiło jak zrealizować funkcję printf (po swojemu): eprintf.