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