I have the following function:
void doStuff(int unusedParameter, ...)
{
va_list params;
va_start(params, unusedParameter);
/* ... */
va_end(params);
}
As part of a refactor, I'd like to remove the unused parameter without otherwise changing the implementation of the function. As far as I can tell, it's impossible to use va_start
when you don't have a last non-variadic parameter to refer to. Is there any way around this?
Background: It is in fact a C++ program, so I could use some operator-overloading magic as suggested here, but I was hoping not to have to change the interface at this point.
The existing function does its work by requiring that the variable argument list be null-terminated, and scanning for the NULL, therefore it doesn't need a leading argument to tell it how many arguments it has.
In response to comments: I don't have to remove the unused parameter, but I'd do it if there were a clean way to do so. I was hoping there'd be something simple I'd missed.
To access variadic arguments, we must include the <stdarg. h> header.
The C printf() function is implemented as a variadic function.
You call it with a va_list and a type, and it takes value pointed at by the va_list as a value of the given type, then increment the pointer by the size of that pointer. For example, va_arg(argp, int) will return (int) *argp , and increment the pointer, so argp += sizeof int .
In GCC, you have a workaround: You can define a macro with a variable number of arguments and then add the dummy parameter in the expansion:
#define doStuff(...) realDoStuff(0, __VA_ARGS__)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With