2015-04-20 3 views
3

У меня есть va_list, в котором есть одна запись. Запись представляет собой целочисленный «hostObject». Мне нужно добавить второй в этот va_list, который будет указателем на другую функцию, которую я планирую вызывать в более поздний момент времени. Пример кода, как показано ниже:Как добавить указатель на существующий va_list?

va_list adjustVarArgs(tag_t hostObject, ...) 
{ 
    va_list adjustedArgs; 

    // TODO: Somehow make 'adjustedArgs' va_list to contain the hostObject and the function pointer. 

    return adjustedArgs; 
} 

int Cfg0VariantConfigSavePost(METHOD_message_t * msg, va_list args) 
{ 
    va_list largs; 
    va_copy(largs, args); 
    tag_t hostObject = va_arg(largs, tag_t); 
    va_end(largs); 

    va_list adjustedArgs = adjustVarArgs(hostObject); 
    return Fnd0VariantConfigSavePost(msg, adjustedArgs); 

    return ITK_ok; 
} 

deleteExprObjects это метод, который я заинтересован в В целом, мне нужно хранить 1. HostObject 2. указатель на функцию:. DeleteExprsCallBack.

Пожалуйста, дайте мне знать, как это можно сделать.

Thanks, Pavan.

+1

Короткий и единственный ответ, что вы не может. «Va_list» - это не что иное, как указатель на стек, что означает, что вы не можете вернуть его из функции, как только функция возвращает аргументы в «списке», на самом деле не существует. –

+1

@JoachimPileborg Это немного сложнее, чем просто указатель на стек в эти дни; см. http://stackoverflow.com/questions/4958384/what-is-the-format-of-the-x86-64-va-list-structure/4958507#4958507 То, что вы делаете, все еще стоит. – Wintermute

ответ

1

В соответствии со стандартом C (7.16), полный список доступных макросов, работающих на va_list является:

Тип объявлена ​​вне
va_list
, который является полным тип объекта подходит для хранения информации необходимых для макросов va_start, va_arg, va_end, и va_copy.

Ни один из этих 4 не может добавить элемент в va_list, так что это невозможно.

Но так как это C++, если вы используете C++ 11, вы могли бы взять VARIADIC аргумент пакет и передает его вместе с указателем на функцию прикрепленного:

template <typename... Args> 
int Cfg0VariantConfigSavePost(METHOD_message_t * msg, tag_t hostObject, Args&&... args) 
{ 
    return Fnd0VariantConfigSavePost(msg, 
     some_func_ptr, 
     hostObject, 
     std::forward<Args>(args)...); 
} 
Смежные вопросы