__stdcall

Блок, относящийся только к системам Microsoft

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

return-type __stdcall function-name[(argument-list)]

Заметки

В следующем списке показана реализация этого соглашения о вызове.

Элемент

Реализация

Порядок передачи аргументов

Справа налево.

Соглашение о передаче аргументов

По значению, кроме случаев передачи указателя или ссылочного типа.

Обязанность по обслуживанию стека

Вызываемая функция извлекает свои аргументы из стека.

Соглашение об оформлении имен

К имени добавляется префикс в виде символа подчеркивания (_). После имени добавляется знак @, за которым следует количество байтов (в десятичном представлении) в списке аргументов. Поэтому функция, объявленная как int func( int a, double b ) декорируется следующим образом: _func@12

Соглашение о преобразовании регистра

Нет

Параметр компилятора /Gz задает соглашение __stdcall для всех функций, которые не были явно объявлены с другим соглашением о вызове.

Функции, объявленные с модификатором __stdcall, возвращают значения таким же образом, как и функции, объявленные с модификатором __cdecl.

На процессорах ARM и 64-разрядных процессорах соглашение __stdcall принимается и игнорируется компилятором; по принятому соглашению в случае архитектуры ARM и 64-разрядной архитектуры аргументы по возможности передаются в регистрах, а остальные аргументы передаются в стеке.

Если используется внестрочное определение нестатической функции класса, то модификатор соглашения о вызовах не должен быть задан во внестрочном определении. То есть для нестатических методов-членов считается, что соглашение о вызовах, указанное во время объявления, было сделано в точке определения. Для приведенного ниже определения класса

struct CMyClass {
   void __stdcall mymethod();
};

this

void CMyClass::mymethod() { return; }

эквивалентно следующему

void __stdcall CMyClass::mymethod() { return; }

Пример

В следующем примере использование __stdcall приводит к тому, что все типы функций WINAPI обрабатываются как стандартный вызов:

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

См. также

Ссылки

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

Ключевые слова в C++