__stdcall

Соглашение о вызове __stdcall используется для вызова функций API Win32. Вызывающий объект очищает стек, поэтому компилятор делает vararg функции __cdecl. Для функций, использующих данное соглашение о вызовах, требуется прототип. Модификатор __stdcall предназначен для Майкрософт.

Синтаксис

return-type__stdcallfunction-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, ...);

См. также

Передача аргументов и соглашения об именовании
Ключевые слова