Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Вызов функции f1(char * format,...) из такой же


Автор: alex2011 5.2.2011, 19:13
Hi All.

У меня теоретический вопрос. Как средствами C или C++ (т.е. не прибегая к ассемблерным вставкам) сделать вот такое:

Есть 2 функции с произвольным числом аргументов, и одна вызывает другую. Например, так:

int f1(char * format, ...)
{
   //тут какие-либо действия, и затем
    va_list p;
    va_start(p,format);
    return vfprintf(stdout,format,p);  //например
}

int f2(char * format, ...)
{
  //тут какие-то подготовительные действия, а затем:
  
   ... что-то ...
   return f1(format, и_что-то_ещё_написать);
}

Т.е. мне надо в f1 передать весь список аргументов из f2 в том же самом порядке и количестве.
А вот как это сделать? Я так понимаю, что мне надо вЫчитать весь список аргументов f2 при помощи va_arg(), потом сделать им PUSH в обратном порядке, потом сделать PUSH format, потом CALL f1, и после возврата скорректировать стек ADD SP, столько_то.
Ну или если бы я писал на "чистом" Ассемблере, возможно, сделал бы по-другому - скорректировал бы стек как надо, а потом бы сделал JMP f1, чтобы по RET оттуда произошёл возврат туда, откуда ранее вызывали f2. 

Но вот как это сделать на C цивилизованно, не прибегая к Ассемблеру? А только с помощью фокусов с va_list и т.д.?

Автор: alex2011 5.2.2011, 20:27
Всё - спасибо, не надо. Нашёл сам исчерпывающий ответ тут:

http://www.rsdn.ru/forum/cpp/3568481.flat.aspx

Автор: xvr 7.2.2011, 12:19
Переносимо - никак. А для gcc - см __builtin_apply_args__builtin_apply и __builtin_return

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)