Подтвердить что ты не робот

Возможно ли иметь вариационную функцию в C без невариантного параметра?

У меня есть следующая функция:

void doStuff(int unusedParameter, ...)
{
    va_list params;
    va_start(params, unusedParameter);
    /* ... */
    va_end(params);
}

Как часть рефактора, я хотел бы удалить неиспользуемый параметр, не изменяя при этом никакой другой реализации функции. Насколько я могу судить, невозможно использовать va_start, если у вас нет последнего невариантного параметра для ссылки. Есть ли способ обойти это?

Справочная информация. Это на самом деле программа на С++, поэтому я мог бы использовать некоторую перегрузку с помощью оператора, как предлагается здесь, но я надеялся, что не придется менять интерфейс в этой точке.

Существующая функция выполняет свою работу, требуя, чтобы список аргументов переменных был завершен с нулевой точкой и сканировал NULL, поэтому ему не нужен главный аргумент, чтобы рассказать ему, сколько аргументов оно имеет.

В ответ на комментарии: мне не нужно удалять неиспользуемый параметр, но я бы сделал это, если бы был чистый способ сделать это. Я надеялся, что будет что-то простое, что я пропустил.

4b9b3361

Ответ 1

Ваш выбор либо оставить его как есть, либо использовать va_list, псевдоним (если он GCC), как указывали другие, или сделать что-то в соответствии с интерфейсом exec(2) - передать массив указателей, требующих NULL terminator:

/* \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& );

Надеюсь, что это поможет.

Ответ 2

В GCC у вас есть обходной путь: вы можете определить макрос с переменным числом аргументов, а затем добавить добавочный параметр в расширение:

#define doStuff(...) realDoStuff(0, __VA_ARGS__)