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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.89
Alecs12
1 / 1 / 0
Регистрация: 21.03.2011
Сообщений: 23
#1

__cdecl and __stdcall - C++

06.07.2011, 22:25. Просмотров 2767. Ответов 7
Метки нет (Все метки)

Доброго времени суток!
При соглашении вызова __cdecl стек очищает вызывающая функция, при __stdcall - вызываемая. В чем это проявляется и что это означает? Ну то есть я понимаю, что стек надо очищать, но в чем будет разница при использовании этих соглашений? Это влияет только на ассемблерный код, который генерит компилятор? В каких случаях что лучше использовать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.07.2011, 22:25     __cdecl and __stdcall
Посмотрите здесь:

Реализация __stdcall, __cdecl - C++
Всем добрый день! Изучаю COM средствами C++. Смысл спецификаторов, указанных мною в заголовке мне понятен, но я хочу для понимания знать,...

Импорт функции __stdcall из DLL - C++
//maindll.cpp: #include <windows.h> extern "C" __declspec(dllexport) void WINAPI foo() { } //main.cpp: #include <iostream> ...

Чем отличается функция с __stdcall и без - C++
Что такое __stdcall? Прочитал на msdn ниче не ясно, чем отличается функция с __stdcall и без. Вот например код: #include <iostream> ...

__stdcall в файле Dll и его использование в екселе - C++
Здраствуйте. У меня вопрос по длл. Я создал дллку через .def file LIBRARY square EXPORTS square и в сорсе добавил описание...

Что означает тип Class A __cdecl(void) ? - C++
День добрый! Помогите разобраться с одним кодом, уже несколько часов голову ломаю. #include <iostream> using namespace std; ...

error C2440: не конвертируется 'LRESULT (__stdcall General::* )(HWND,UINT,WPARAM,LPARAM)' to 'WNDPROC' - C++
Здравствуйте! Подскажите, пожалуйста, как исправить эту ошибку в этой строчке: wcex.lpfnWndProc = &General::WindowProcedure;...

Ошибка: error C2783: 'T __cdecl sumF(void)' : could not deduce template argument for 'T' - C++
#include <iostream> #include <conio.h> using namespace std; int a; template< typename T > T sumF() { T s=0; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kazak
3034 / 2355 / 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
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
07.07.2011, 00:13     __cdecl and __stdcall #4
Разницу видно в дизассемблированном коде и в том, что функции __cdecl могут иметь переменное число параметров (как printf, например).
xAtom
914 / 739 / 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
Эксперт CАвтор FAQ
17536 / 5774 / 370
Регистрация: 30.03.2009
Сообщений: 15,891
Записей в блоге: 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
Еще ссылки по теме:

Ошибка: ссылка на неразрешенный внешний символ "void __cdecl fifth(int)" (?fifth@@YAXH@Z) - C++
Столкнулся с такой ошибкой: ссылка на неразрешенный внешний символ "void __cdecl fifth(int)" (?fifth@@YAXH@Z) в функции _main и не знаю,...

Ошибка ссылка на неразрешенный внешний символ "long __cdecl time_to_secs(struct Time)" - C++
#include<iostream> using namespace std; ///////////////////////////////// struct Time { int hours; int minutes; int...

Ошибка LNK2019 ссылка на неразрешенный внешний символ _main в функции "int __cdecl invoke_main(void)" - C++
В текстовый файл вставить пробелы таким образом, чтобы каждая строка имела длину 80 символов (пробелы в строке должны быть вставлены...

Error LNK2019: unresolved external symbol "public: __cdecl videoInput::videoInput(void)" - C++
Добрый день, уважаемые форумчане. Столкнулся при написании программы на Opencv с некоторой проблемой в бибилиотеке VideoInput при написании...

Ошибки: в 17 и 26 строках потеря прототипа, а в 30 и 44 expected 'int __cdecl function()' but found 'note * __cdecl... - C (СИ)
Подскажите пожалуйста в чем причина ошибок #include <stdio.h> #include<conio.h> #include<string.h> #include<stdlib.h> typedef...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru