Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции f1(char * format,...) из такой же, Функции с перем.числом аргументов 
V
    Опции темы
alex2011
Дата 5.2.2011, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.1.2011

Репутация: нет
Всего: нет



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 и т.д.?

PM MAIL   Вверх
alex2011
Дата 5.2.2011, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.1.2011

Репутация: нет
Всего: нет



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

http://www.rsdn.ru/forum/cpp/3568481.flat.aspx
PM MAIL   Вверх
xvr
Дата 7.2.2011, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Переносимо - никак. А для gcc - см __builtin_apply_args__builtin_apply и __builtin_return

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0694 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.