You want to pass a variable number of arguments to a function which is ok, but it has a quirky syntax.
The idea is that a C function pushes all it's arguments, makes the function call, then pops all the arguments. This means that the caller knows how many there are. If the called function wants to allow this, it uses the ... syntax to say so.
For example,
int kbwTrace(constchar *fmt, ...);
The next bit is the syntax to support access to these args, these are va_list and va_start.
Using variable number of args may be anti-OO, but it's not anti-C++.
Yes, it is. It isn't type-safe, it is needlessly redundant, and C++ provides better means to achieve the same effect (depending on the actual problem that might be virtual functions, function pointers, overloading, streams, ...). Or do you really think that you know the types you pass better than your compiler?