__stdcall
Соглашение о вызове __stdcall
используется для вызова функций API Win32. Вызывающий объект очищает стек, поэтому компилятор делает vararg
функции __cdecl
. Для функций, использующих данное соглашение о вызовах, требуется прототип. Модификатор __stdcall
предназначен для Майкрософт.
Синтаксис
return-type
__stdcall
function-name[(
argument-list)
]
Замечания
В следующем списке показана реализация этого соглашения о вызовах.
Элемент | Внедрение |
---|---|
Порядок передачи аргументов | Справа налево. |
Соглашение о передаче аргументов | По значению, кроме случаев передачи указателя или ссылочного типа. |
Обязанность по обслуживанию стека | Вызываемая функция извлекает свои аргументы из стека. |
Соглашение об оформлении имен | Символ подчеркивания (_ ) префиксируется в имя. За именем следует знак (@ ), за которым следует число байтов (десятично) в списке аргументов. Поэтому функция, объявленная как int func( int a, double b ) декорируется следующим образом: _func@12 |
Соглашение о преобразовании регистра | None |
Параметр компилятора /Gz указывает для всех функций, которые явно не объявлены __stdcall
с помощью другого соглашения о вызовах.
Для совместимости с предыдущими версиями является синонимом__stdcall
, _stdcall
если не указан параметр /Za
компилятора (отключить расширения языка).
Функции, объявленные с помощью __stdcall
модификатора, возвращают значения так же, как и функции, объявленные с помощью __cdecl
.
В процессорах __stdcall
ARM и x64 принимается и игнорируется компилятором; в архитектурах ARM и x64 по соглашению аргументы передаются в регистры, когда это возможно, и последующие аргументы передаются в стек.
Если используется внестрочное определение нестатической функции класса, то модификатор соглашения о вызовах не должен быть задан во внестрочном определении. То есть для нестатических методов-членов считается, что соглашение о вызовах, указанное во время объявления, было сделано в точке определения. Для приведенного ниже определения класса
struct CMyClass {
void __stdcall mymethod();
};
this
void CMyClass::mymethod() { return; }
эквивалентно следующему
void __stdcall CMyClass::mymethod() { return; }
Пример
В следующем примере использование результатов во всех WINAPI
типах __stdcall
функций, обрабатываемых как стандартный вызов:
// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);
См. также
Передача аргументов и соглашения об именовании
Ключевые слова
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по