Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
1

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

10.07.2015, 16:20. Показов 6614. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Что такое __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.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2015, 16:20
Ответы с готовыми решениями:

Чем внешняя функция отличается от дружественной кроме как синтаксисом?
Внешняя class CBox { public: double m_Length; ...

Чем отличается if от (?:)
Здравствуйте. Почитываю С++, сам программирую в Делфи. Вот немного запутался. В делфи есть условный...

Чем отличается this от *this?
Привет всем ! вот код template&lt;typename Key, typename Value&gt; Dictionary&lt;Key, Value&gt;&amp;...

Чем new отличается от malloc?
Чем new отличается от malloc?

17
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
10.07.2015, 16:24 2
ninja2, https://ru.wikipedia.org/wiki/... 0%B2%D0%B5
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.07.2015, 17:12 3
На всякий случай: Реализация __stdcall, __cdecl
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
10.07.2015, 18:20  [ТС] 4
Evg, DrOffset, Короче я так понял это типо для оптимизации используется и все. Можно за них не парится, типо низкоуровневая фигня на которую не стоит заморачиватся да?
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.07.2015, 18:21 5
Если вопрос стоит о том, нужно ли для своих программ использовать __stdcall, то ответ "да"
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
10.07.2015, 18:21 6
Цитата Сообщение от ninja2 Посмотреть сообщение
Можно за них не парится, типо низкоуровневая фигня на которую не стоит заморачиватся да?
Зависит от того зачем ты спрашивал.
Париться или нет - тебе решать. Мы свечку держать не сможем
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
10.07.2015, 18:38  [ТС] 7
Цитата Сообщение от Evg Посмотреть сообщение
Если вопрос стоит о том, нужно ли для своих программ использовать __stdcall, то ответ "да"
ну можно и не заморачиватся?
Соглашение __stdcall используется для вызова функций API Win32.
Оно ж для API Win32 используется.
Я так понял это не важно для разработки, это как бы конечный этап типо оптимизации, когда уже все будет готово, потом уже можно над этим позаморачиватся если нужно будет

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

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

Не по теме:

DELDEL

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

Не по теме:

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

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

Не по теме:

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

0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
11.07.2015, 09:55 15
-=ЮрА=-, ну почему же? Если показаны различия между разными соглашениями вызова, то вопрос ТС
ну можно и не заморачиватся?
отпадет сам собой :-)

Ну и хорошие статьи/примеры всегда интересно почитать :-) и не только ТС
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
11.07.2015, 14:33  [ТС] 16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- не тот call вставил, хотел показать отличие в работе программы при отличии в порядке помещения аргументов, но это чуть не по данной теме. Поэтому и вытер
Как раз по данной теме "Соглашение вызовов", можно было бы и не удалять, хай бы было
0
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
13.07.2015, 15:10 17
Цитата Сообщение от DrOffset Посмотреть сообщение
Например, мы пользуемся WinAPI, например, есть некая API функция, которая принимает callback. И этот callback она ждет в соответствии с stdcall. Тогда функцию, которую мы делаем callback'ом, нужно обозначить как __stdcall, чтобы ее вызов внутри API функции был корректным.

ninja2, классический пример - оконная процедура. Макрос CALLBACK - как раз разворачивается в __stdcall.
Вот у меня тоже возникла проблема, подозреваю что из-за несоответствия соглашений о вызовах. То есть программа работала нормально до того, как в нее был добавлен диалог, в процедуру которого я передаю указатель на мой объект. Вроде нормально вызывается метод объекта, начинает выполняться, а потом на ровном месте (присвоение закрытому члену значения) молча перестает работать. В свойствах конфигурации в "Соглашении о вызовах" выставлено _cdecl(/Gd). Подскажите, в чем дело, и как с этим бороться?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
13.07.2015, 15:53 18
Цитата Сообщение от VIKT0R Посмотреть сообщение
Подскажите, в чем дело, и как с этим бороться?
Нужно код смотреть.
0
13.07.2015, 15:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2015, 15:53
Помогаю со студенческими работами здесь

Чем C++ отличается от C++ Builder?
Чем C++ отличается от C++ Builder? И если имеется желание писать именно в C++, а не в билдере, то...

Чем отличается С++ от Visual С++?
Здравствуете товарищи программисты! Только начал изучать язык программирования С++ и возникло пару...

Чем отличается ln , lg, и log ?
и как реализуются эти функцию в c++

Чем отличается istringstream от stringstream?
можете объяснить работу каждого оператора?


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru