У меня есть следующая функция:
void doStuff(int unusedParameter, ...)
{
va_list params;
va_start(params, unusedParameter);
/* ... */
va_end(params);
}
Как часть осуществления рефакторинг, я хотел бы удалить неиспользованный параметр, иначе не изменяя реализацию функции. Насколько я могу сказать, невозможно использовать va_start
когда у Вас нет последнего non-variadic параметра для обращения к. Есть ли какой-либо путь вокруг этого?
Фон: Это - на самом деле программа C++, таким образом, я мог использовать некоторое перегружающее оператор волшебство, как предложено здесь, но я надеялся не должным быть изменить интерфейс в этой точке.
Существующая функция делает свою работу путем требования, чтобы аргумент переменной перечислил быть завершенным пустым указателем, и сканирующий для ПУСТОГО УКАЗАТЕЛЯ, поэтому этому не нужен ведущий аргумент для сообщения этого, сколько аргументов это имеет.
В ответ на комментарии: Я не должен удалять неиспользованный параметр, но я сделал бы это, если бы был очевидный способ, чтобы сделать так. Я надеялся, что будет что-то простое, которое я пропустил.
Ваш выбор либо оставить все как есть и использовать va_list
, псевдоним (если это GCC), как указывали другие, либо сделать что-то в соответствии со строками интерфейса exec (2)
- передача массива указателей, требующих терминатора NULL
:
/* \param args NULL-terminated array of
* pointers to arguments.
*/
void doStuff( void* args[] );
В любом случае было бы гораздо лучше реорганизовать интерфейс, чтобы каким-то образом воспользоваться системой типов - возможно, перегрузка для конкретных используемых типов аргументов:
void doStuff( int );
void doStuff( const std::string& );
void doStuff( const MyFancyAppClass& );
Надеюсь это поможет.
В GCC есть обходной путь: Вы можете определить макрос с переменным числом аргументов, а затем добавить фиктивный параметр в расширение:
#define doStuff(...) realDoStuff(0, __VA_ARGS__)