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

Чем отличается функция с __stdcall и без - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
10.07.2015, 16:20     Чем отличается функция с __stdcall и без #1
Что такое __stdcall? Прочитал на msdn ниче не ясно, чем отличается функция с __stdcall и без. Вот например код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using std::cout;
 
//создадим свой макрос
int __stdcall f1(int k){return k*k;}
int f2(int k){return k*k;}
 
int main()
{
 
    cout <<"start\r\n";
 
    cout <<"f1()= "<<f1(10)<<"\r\n";
    cout <<"f2()= "<<f2(10)<<"\r\n";
 
    return 0;
}
Одинаково выводит.

И еще в макросе заметил что он тоже добавляет эту штуку, от в этом макросе IMPLEMENT_DYNCREATE(CSpaceship,CCmdTarget)

Создается функция которая возвращает указатель на объект CSpaceship, вроде ее определение создается вида:
C++
1
2
CObject* PASCAL CSpaceship::CreateObject() 
        { return new CSpaceship; }
макрос PASCAL - это __stdcall.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2015, 16:20     Чем отличается функция с __stdcall и без
Посмотрите здесь:

C++ Чем отличается С++ от Visual С++?
Чем отличается ln , lg, и log ? C++
C++ Чем отличается this от *this?
C++ чем new отличается от malloc?
C++ Чем внешняя функция отличается от дружественной кроме как синтаксисом?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
10.07.2015, 16:24     Чем отличается функция с __stdcall и без #2
ninja2, https://ru.wikipedia.org/wiki/%D0%A1...BE%D0%B2%D0%B5
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
10.07.2015, 17:12     Чем отличается функция с __stdcall и без #3
На всякий случай: Реализация __stdcall, __cdecl
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
10.07.2015, 18:20  [ТС]     Чем отличается функция с __stdcall и без #4
Evg, DrOffset, Короче я так понял это типо для оптимизации используется и все. Можно за них не парится, типо низкоуровневая фигня на которую не стоит заморачиватся да?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
10.07.2015, 18:21     Чем отличается функция с __stdcall и без #5
Если вопрос стоит о том, нужно ли для своих программ использовать __stdcall, то ответ "да"
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
10.07.2015, 18:21     Чем отличается функция с __stdcall и без #6
Цитата Сообщение от ninja2 Посмотреть сообщение
Можно за них не парится, типо низкоуровневая фигня на которую не стоит заморачиватся да?
Зависит от того зачем ты спрашивал.
Париться или нет - тебе решать. Мы свечку держать не сможем
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
10.07.2015, 18:38  [ТС]     Чем отличается функция с __stdcall и без #7
Цитата Сообщение от Evg Посмотреть сообщение
Если вопрос стоит о том, нужно ли для своих программ использовать __stdcall, то ответ "да"
ну можно и не заморачиватся?
Соглашение __stdcall используется для вызова функций API Win32.
Оно ж для API Win32 используется.
Я так понял это не важно для разработки, это как бы конечный этап типо оптимизации, когда уже все будет готово, потом уже можно над этим позаморачиватся если нужно будет

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Зависит от того зачем ты спрашивал.
Та просто ради интереса! Увидел незнакомое определение, в MFC полно всяких незнакомых макросов и всякой фигни еще
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
10.07.2015, 18:40     Чем отличается функция с __stdcall и без #8
Цитата Сообщение от ninja2 Посмотреть сообщение
Та просто ради интереса!
Тогда не заморачивайся.
Вернешься к этому, как оно само в дверь постучит
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
10.07.2015, 18:41  [ТС]     Чем отличается функция с __stdcall и без #9
__stdcall применяется к WinApi функциям, а мы что можем его и к любым функциям применять? От макрос IMPLEMENT_DYNCREATE(CSpaceship,CCmdTarget) создает левую функцию - не винапи с __stdcall
C++
1
2
CObject* PASCAL CSpaceship::CreateObject() 
        { return new CSpaceship; }
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
10.07.2015, 18:50     Чем отличается функция с __stdcall и без #10
Цитата Сообщение от ninja2 Посмотреть сообщение
а мы что можем его и к любым функциям применять?
Можем.
Например, мы пользуемся WinAPI, например, есть некая API функция, которая принимает callback. И этот callback она ждет в соответствии с stdcall. Тогда функцию, которую мы делаем callback'ом, нужно обозначить как __stdcall, чтобы ее вызов внутри API функции был корректным.

Добавлено через 2 минуты
ninja2, классический пример - оконная процедура. Макрос CALLBACK - как раз разворачивается в __stdcall.
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
10.07.2015, 18:58     Чем отличается функция с __stdcall и без #11
а еще когда дергаешь функции из dll
несоблюдение соглашений есть путь к краху программы
в каком порядке передаются аргументы? несоблюдение приведет или к краху или к неправильному вычислению
кто будет чистить стек, вызываемая функция или вызывающая,это точно крах
-=ЮрА=-
11.07.2015, 09:36
  #12

Не по теме:

DELDEL

Ev[G]eN
11.07.2015, 09:43
  #13

Не по теме:

-=ЮрА=-, только собрался открывать картинку, что бы посмотреть, а Вы тут со своим "DELDEL"

-=ЮрА=-
11.07.2015, 09:50
  #14

Не по теме:

Цитата Сообщение от Ev[G]eN Посмотреть сообщение
-=ЮрА=-, только собрался открывать картинку, что бы посмотреть, а Вы тут со своим "DELDEL"
- не тот call вставил, хотел показать отличие в работе программы при отличии в порядке помещения аргументов, но это чуть не по данной теме. Поэтому и вытер

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11820 / 6799 / 769
Регистрация: 27.09.2012
Сообщений: 16,874
Записей в блоге: 2
Завершенные тесты: 1
11.07.2015, 09:55     Чем отличается функция с __stdcall и без #15
-=ЮрА=-, ну почему же? Если показаны различия между разными соглашениями вызова, то вопрос ТС
ну можно и не заморачиватся?
отпадет сам собой :-)

Ну и хорошие статьи/примеры всегда интересно почитать :-) и не только ТС
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.07.2015, 14:33  [ТС]     Чем отличается функция с __stdcall и без #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- не тот call вставил, хотел показать отличие в работе программы при отличии в порядке помещения аргументов, но это чуть не по данной теме. Поэтому и вытер
Как раз по данной теме "Соглашение вызовов", можно было бы и не удалять, хай бы было
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 78
13.07.2015, 15:10     Чем отличается функция с __stdcall и без #17
Цитата Сообщение от DrOffset Посмотреть сообщение
Например, мы пользуемся WinAPI, например, есть некая API функция, которая принимает callback. И этот callback она ждет в соответствии с stdcall. Тогда функцию, которую мы делаем callback'ом, нужно обозначить как __stdcall, чтобы ее вызов внутри API функции был корректным.

ninja2, классический пример - оконная процедура. Макрос CALLBACK - как раз разворачивается в __stdcall.
Вот у меня тоже возникла проблема, подозреваю что из-за несоответствия соглашений о вызовах. То есть программа работала нормально до того, как в нее был добавлен диалог, в процедуру которого я передаю указатель на мой объект. Вроде нормально вызывается метод объекта, начинает выполняться, а потом на ровном месте (присвоение закрытому члену значения) молча перестает работать. В свойствах конфигурации в "Соглашении о вызовах" выставлено _cdecl(/Gd). Подскажите, в чем дело, и как с этим бороться?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2015, 15:53     Чем отличается функция с __stdcall и без
Еще ссылки по теме:

Чем struct отличается от class? C++
Чем C++ отличается от C++ Builder? C++
C++ Чем отличается if от (?:)

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

Или воспользуйтесь поиском по форуму:
DrOffset
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
13.07.2015, 15:53     Чем отличается функция с __stdcall и без #18
Цитата Сообщение от VIKT0R Посмотреть сообщение
Подскажите, в чем дело, и как с этим бороться?
Нужно код смотреть.
Yandex
Объявления
13.07.2015, 15:53     Чем отличается функция с __stdcall и без
Ответ Создать тему
Опции темы

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