Поделиться через


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

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

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

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

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

Примечание

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

Дополнительные сведения об определении собственного кода пролога и эпилога функции см. в разделе Вызов функции с атрибутом naked.

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

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

Ключевое слово

Очистка стека

Передача параметров

__cdecl

Вызывающая функция

Параметры помещаются в стек в обратном порядке (справа налево)

__clrcall

Н/Д

Параметры загружаются в стек выражений CLR по-порядку (слева направо).

__stdcall

Вызываемая функция

Параметры помещаются в стек в обратном порядке (справа налево)

__fastcall

Вызываемая функция

Хранятся в регистрах, затем помещаются в стек

__thiscall

Вызываемая функция

Помещаются в стек; указатель this хранится в регистре ECX

__vectorcall

Вызываемая функция

Хранятся в регистрах, затем помещаются в стек в обратном порядке (справа налево)

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

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

См. также

Ссылки

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