Форум программистов, компьютерный форум CyberForum.ru

__cdecl and __stdcall - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
Alecs12
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
06.07.2011, 22:25     __cdecl and __stdcall #1
Доброго времени суток!
При соглашении вызова __cdecl стек очищает вызывающая функция, при __stdcall - вызываемая. В чем это проявляется и что это означает? Ну то есть я понимаю, что стек надо очищать, но в чем будет разница при использовании этих соглашений? Это влияет только на ассемблерный код, который генерит компилятор? В каких случаях что лучше использовать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
06.07.2011, 23:14     __cdecl and __stdcall #2
http://ru.wikipedia.org/wiki/Соглашение_вызова
Alecs12
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
06.07.2011, 23:53  [ТС]     __cdecl and __stdcall #3
Ну да, я это все читал. Я не понимаю, или не полностью понимаю, что означает, в чем проявляется тот момент, какая функция (вызывающая или вызываемая) очищает стек. Где видно эту разницу и что это дает.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
07.07.2011, 00:13     __cdecl and __stdcall #4
Разницу видно в дизассемблированном коде и в том, что функции __cdecl могут иметь переменное число параметров (как printf, например).
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
07.07.2011, 02:43     __cdecl and __stdcall #5
Да правильно, __cdecl очищает стек от параметров вызываемая программа add ESP, N - количество байт переданных процедуре.
__stdcall - процедура сама очищает ret N - кол-во байт, __fastcall - передача через регистры только два. Если процедура-функция вызывается многократна например на события таймера то нужно чтобы сама процедура за собой стек очищала вот почему все обработчики сообщений в WinApi декларируются как __stdcall макрос WINAPI.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16830 / 5251 / 322
Регистрация: 30.03.2009
Сообщений: 14,144
Записей в блоге: 26
07.07.2011, 15:12     __cdecl and __stdcall #6
Цитата Сообщение от Alecs12 Посмотреть сообщение
Доброго времени суток!
При соглашении вызова __cdecl стек очищает вызывающая функция, при __stdcall - вызываемая. В чем это проявляется и что это означает? Ну то есть я понимаю, что стек надо очищать, но в чем будет разница при использовании этих соглашений? Это влияет только на ассемблерный код, который генерит компилятор? В каких случаях что лучше использовать?
Может это чем-то поможет
Реализация __stdcall, __cdecl
Alecs12
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
07.07.2011, 23:50  [ТС]     __cdecl and __stdcall #7
Цитата Сообщение от xAtom Посмотреть сообщение
Да правильно, __cdecl очищает стек от параметров вызываемая программа add ESP, N - количество байт переданных процедуре.
__stdcall - процедура сама очищает ret N - кол-во байт, __fastcall - передача через регистры только два. Если процедура-функция вызывается многократна например на события таймера то нужно чтобы сама процедура за собой стек очищала вот почему все обработчики сообщений в WinApi декларируются как __stdcall макрос WINAPI.
Т.е. при __cdecl функция, которую вызывает не имеет в своем ассемблерном коде ret? а при __stdcall имеет?
add ESP, N увеличивает указатель на вершину стека, это идет до вызова функции, потом вызов функции по__cdecl, потом в функции, что вызывала уменьшается ESP на N?

Цитата Сообщение от Evg Посмотреть сообщение
Может это чем-то поможет
Реализация __stdcall, __cdecl
Да, я это читал, очень хорошо написано, спасибо =) Но Вы там не писали про ту часть, что я не очень уразумел.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2011, 11:08     __cdecl and __stdcall
Еще ссылки по теме:

C++ LNK2019: ссылка на неразрешенный внешний символ "void __cdecl run(void)" (?run@@YAXXZ) в функции _wmain
Чем отличается функция с __stdcall и без C++
C++ Ошибка ссылка на неразрешенный внешний символ "long __cdecl time_to_secs(struct Time)"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16830 / 5251 / 322
Регистрация: 30.03.2009
Сообщений: 14,144
Записей в блоге: 26
08.07.2011, 11:08     __cdecl and __stdcall #8
Цитата Сообщение от Alecs12 Посмотреть сообщение
Но Вы там не писали про ту часть, что я не очень уразумел
Там я просто попытался ответить на вопрос (предположил) ЗАЧЕМ оно сделано. А в конкретике я всё равно тебе не отвечу, ибо в intel'овской системе команд не разбираюсь
Yandex
Объявления
08.07.2011, 11:08     __cdecl and __stdcall
Ответ Создать тему
Опции темы

Текущее время: 21:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru