Действительно ли возможно иметь функцию variadic в C без non-variadic параметра?

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

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

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

Фон: Это - на самом деле программа C++, таким образом, я мог использовать некоторое перегружающее оператор волшебство, как предложено здесь, но я надеялся не должным быть изменить интерфейс в этой точке.

Существующая функция делает свою работу путем требования, чтобы аргумент переменной перечислил быть завершенным пустым указателем, и сканирующий для ПУСТОГО УКАЗАТЕЛЯ, поэтому этому не нужен ведущий аргумент для сообщения этого, сколько аргументов это имеет.

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

16
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

Ваш выбор либо оставить все как есть и использовать 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& );

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

3
ответ дан 30 November 2019 в 22:37
поделиться

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

#define doStuff(...) realDoStuff(0, __VA_ARGS__)
14
ответ дан 30 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: