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

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

Войти
Регистрация
Восстановить пароль
 
 
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

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

Что такое __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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2015, 16:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чем отличается функция с __stdcall и без (C++):

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

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

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

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

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

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

17
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
10.07.2015, 16:24 #2
ninja2, https://ru.wikipedia.org/wiki/%D0%A1...BE%D0%B2%D0%B5
1
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,205
Записей в блоге: 27
10.07.2015, 17:12 #3
На всякий случай: Реализация __stdcall, __cdecl
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
10.07.2015, 18:20  [ТС] #4
Evg, DrOffset, Короче я так понял это типо для оптимизации используется и все. Можно за них не парится, типо низкоуровневая фигня на которую не стоит заморачиватся да?
0
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,205
Записей в блоге: 27
10.07.2015, 18:21 #5
Если вопрос стоит о том, нужно ли для своих программ использовать __stdcall, то ответ "да"
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
10.07.2015, 18:21 #6
Цитата Сообщение от ninja2 Посмотреть сообщение
Можно за них не парится, типо низкоуровневая фигня на которую не стоит заморачиватся да?
Зависит от того зачем ты спрашивал.
Париться или нет - тебе решать. Мы свечку держать не сможем
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
10.07.2015, 18:38  [ТС] #7
Цитата Сообщение от Evg Посмотреть сообщение
Если вопрос стоит о том, нужно ли для своих программ использовать __stdcall, то ответ "да"
ну можно и не заморачиватся?
Соглашение __stdcall используется для вызова функций API Win32.
Оно ж для API Win32 используется.
Я так понял это не важно для разработки, это как бы конечный этап типо оптимизации, когда уже все будет готово, потом уже можно над этим позаморачиватся если нужно будет

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

Добавлено через 2 минуты
ninja2, классический пример - оконная процедура. Макрос CALLBACK - как раз разворачивается в __stdcall.
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,072
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"

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

Не по теме:

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

0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,873
Записей в блоге: 3
Завершенные тесты: 1
11.07.2015, 09:55 #15
-=ЮрА=-, ну почему же? Если показаны различия между разными соглашениями вызова, то вопрос ТС
ну можно и не заморачиватся?
отпадет сам собой :-)

Ну и хорошие статьи/примеры всегда интересно почитать :-) и не только ТС
0
11.07.2015, 09:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2015, 09:55
Привет! Вот еще темы с ответами:

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

Чем отличается override от virtual? - C++
Так и не понял. Если указать метод как override, то он переопределит метод базового класса Для этого метод базового класса должен быть...

Чем struct отличается от class? - C++
Чем отличаются эти ключевые слова кроме public/private по умолчанию?

Чем отличается описание от определения - C++
Примеры: int count; int count; Здесь ошибка: переопределение А вот здесь ошибки почему-то нет: extern int...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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