views:

183

answers:

2

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.

+3  A: 

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__)
Aaron Digulla
Link to docs on variadic macros is here: http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html +1, you beat me by a few seconds :)
Tim Post
`__VA_ARGS__` is a part of C99 standard of C language. So, it is not really "in GCC" but rather "in modern C" :)
AndreyT
Also supported in VC++ 2005 and later, even though that does not support C99.
Clifford
+2  A: 
Nikolai N Fetissov