Передача аргументов и соглашения именования
Блок, относящийся только к системам Майкрософт
Компиляторы 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 | Вызываемая функция | Хранятся в регистрах, затем помещаются в стек в обратном порядке (справа налево) |
Дополнительные сведения см. в разделе "Устаревшие соглашения о вызовах".
Завершение блока, относящегося только к системам Майкрософт
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по