![]() |
Модераторы: xvr |
![]() ![]() ![]() |
|
alex2011 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 и т.д.? |
|||
|
||||
alex2011 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 15.1.2011 Репутация: нет Всего: нет |
Всё - спасибо, не надо. Нашёл сам исчерпывающий ответ тут:
http://www.rsdn.ru/forum/cpp/3568481.flat.aspx |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Переносимо - никак. А для gcc - см __builtin_apply_args, __builtin_apply и __builtin_return
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Программирование под Unix/Linux" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |