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

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

Компиляторы Microsoft C++ позволяют указывать соглашения для передачи аргументов и возвращаемых значений между функциями и вызывающими. Некоторые соглашения доступны не на всех поддерживаемых платформах, и в некоторых соглашениях используются реализации, зависящие от платформы. В большинстве случаев ключевые слова или параметры компилятора, которые задают неподдерживаемое на определенной платформе соглашение, игнорируются, и используется соглашение по умолчанию для данной платформы.

На платформах x86 все аргументы расширяются до 32 бит при передаче. Возвращаемые значения также расширяются до 32 бит и возвращаются в регистре EAX, за исключением 8-байтовых структур, которые возвращаются в паре регистров EDX:EAX. Более крупные структуры возвращаются в регистре EAX в виде указателей на скрытые возвращаемые структуры. Параметры помещаются в стек справа налево. Структуры, не являющиеся данными POD (обычные старые данные), не возвращаются в регистрах.

Компилятор создает код пролога и эпилога для сохранения и восстановления регистров ESI, EDI, EBX и EBP, если они используются в функции.

Примечание.

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

Сведения о том, как определить собственный пролог функции и код эпилога, см. в разделе "Голые вызовы функций".

Сведения о соглашениях о вызовах по умолчанию в коде, предназначенных для платформ x64, см . в соглашении о вызовах x64. Сведения о проблемах с соглашениями о вызове в коде, предназначенных для платформ ARM, см. в статье Common Visual C++ ARM Migration Issues.

Компилятор Visual C/C++ поддерживает следующие соглашения о вызовах.

Ключевое слово Очистка стека Передача параметров
__cdecl Вызывающая сторона Параметры помещаются в стек в обратном порядке (справа налево)
__clrcall Н/Д Параметры загружаются в стек выражений CLR по-порядку (слева направо).
__stdcall Вызываемая функция Параметры помещаются в стек в обратном порядке (справа налево)
__fastcall Вызываемая функция Хранятся в регистрах, затем помещаются в стек
__thiscall Вызываемая функция Отправка на стек; this указатель, хранящийся в ECX
__vectorcall Вызываемая функция Хранятся в регистрах, затем помещаются в стек в обратном порядке (справа налево)

Дополнительные сведения см. в разделе "Устаревшие соглашения о вызовах".

Завершение блока, относящегося только к системам Майкрософт

См. также

Соглашения о вызовах