/Gd, /Gr, /Gv, /Gz (соглашение о вызовах)
Эти параметры определяют порядок, в котором аргументы функции передаются в стек, то, удаляет ли вызывающая или вызываемая функция аргументы из стека в конце вызова, а также соглашение о декорировании имен, используемое компилятором для идентификации отдельных функций.
Синтаксис
/Gd
/Gr
/Gv
/Gz
Замечания
/Gd
Параметр по умолчанию задает соглашение о вызове __cdecl для всех функций, кроме функций-членов C++, помеченных __stdcall, __fastcall или __vectorcall.
/Gr
указывает соглашение о вызове __fastcall
для всех функций, кроме функций-членов C++, именованных main
функций и функций, помеченных __cdecl
как , __stdcall
или __vectorcall
. Все функции __fastcall
должны иметь прототипы. Это соглашение о вызовах доступно только в компиляторах для 32-разрядных систем и игнорируется компиляторами, предназначенными для других архитектур.
/Gz
указывает соглашение о вызове __stdcall
для всех функций, кроме функций-членов C++, именованных main
функций и функций, помеченных __cdecl
как , __fastcall
или __vectorcall
. Все функции __stdcall
должны иметь прототипы. Это соглашение о вызовах доступно только в компиляторах для 32-разрядных систем и игнорируется компиляторами, предназначенными для других архитектур.
/Gv
указывает __vectorcall
соглашение о вызове для всех функций, кроме функций-членов C++, именованных main
функций, функций с списком vararg
аргументов переменной или функций, помеченных конфликтующими или атрибутами__stdcall
__cdecl
__fastcall
. Это соглашение о вызовах доступно только в 32- и 64-разрядных архитектурах, поддерживающих /arch:SSE2 и более поздние версии, и игнорируется компиляторами, предназначенными для архитектуры ARM.
Функции, принимающие переменное число аргументов, должны иметь пометку __cdecl
.
/Gd
, /Gr
и несовместимы с /clr:safe
/clr:pure./Gz
/Gv
Параметры компилятора /clr:pure и /clr:safe не рекомендуется использовать в Visual Studio 2015, и они не поддерживаются в Visual Studio 2017 и более поздних версий.
Примечание.
По умолчанию для процессоров x86 функции-члены C++ используются __thiscall
.
Для всех процессоров функция-член, явно помеченная как __cdecl
, __fastcall
, __vectorcall
или __stdcall
, использует указанное соглашение о вызовах, если оно не игнорируется в данной архитектуре. Функция-член, принимающая переменное число аргументов, всегда использует соглашение о вызовах __cdecl
.
Эти параметры компилятора не влияют на декорирование имен методов и функций C++. Если методы и функции C++ не объявлены как extern "C"
, к ним применяется другая схема декорирования имен. Дополнительные сведения см. в статье Внутренние имена.
Дополнительные сведения о соглашениях о вызовах см. в статье Соглашения о вызовах.
Особенности соглашения __cdecl
В 32-разрядных процессорах все аргументы функции передаются в стеке справа налево. В ARM и 64-разрядных архитектурах некоторые аргументы передаются в регистрах, а остальные — в стеке справа налево. Вызывающая подпрограмма извлекает аргументы из стека.
Для языка C соглашение об именовании __cdecl
предусматривает использование имени функции с символом подчеркивания перед ним (_
). Преобразование регистра не выполняется. Если функции C++ не объявлены как extern "C"
, к ним применяется другая схема декорирования имен. Дополнительные сведения см. в статье Внутренние имена.
Особенности соглашения __fastcall
Некоторые аргументы функции __fastcall
передаются в регистрах (для 32-разрядных процессоров, ECX и EDX), а остальные — в стеке справа налево. Вызываемая подпрограмма извлекает аргументы из стека до возврата управления. Как правило, параметр /Gr уменьшает время выполнения.
Примечание.
Будьте осторожны при использовании соглашения о вызовах __fastcall
для функции, написанной на встроенном языке ассемблера. Использование регистров может конфликтовать с использованием компилятора.
Для языка C соглашение об именовании __fastcall
предусматривает использование имени функции с символом @ перед ним и размером аргументов функции в байтах после него. Преобразование регистра не выполняется. В качестве соглашения об именовании компилятор использует следующий шаблон:
@function_name@number
С соглашением об именовании __fastcall
следует использовать стандартные файлы включения. В противном случае вы получите неразрешенные внешние ссылки.
Особенности соглашения __stdcall
Аргументы функции __stdcall
помещаются в стек справа налево. Вызываемая функция извлекает эти аргументы из стека до возврата управления.
__stdcall
Для C соглашение об именовании использует имя функции, предшествующее символу подчеркивания (@_), за которым следует знак () и размер аргументов функции в байтах. Преобразование регистра не выполняется. В качестве соглашения об именовании компилятор использует следующий шаблон:
_functionname@number
Особенности соглашения __vectorcall
__vectorcall
Целочисленные аргументы функции передаются по значению, используя до двух (x86) или четырех (в x64) целочисленных регистров и до шести регистров XMM для значений с плавающей запятой и векторов, а остальные передаются в стек справа налево. Вызываемая функция очищает стек до возврата управления. Возвращаемые векторные значения и значения с плавающей запятой возвращаются в XMM0.
Для языка C соглашение об именовании __vectorcall
предусматривает использование имени функции с двумя символами @@ и размером аргументов функции в байтах после него. Преобразование регистра не выполняется. В качестве соглашения об именовании компилятор использует следующий шаблон:
functionname@@number
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
Выберите страницу свойств>конфигурации C/C++>Advanced.
Измените свойство Соглашение о вызовах.
Установка данного параметра компилятора программным способом
- См. раздел CallingConvention.