Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Эти параметры определяют порядок, в котором аргументы функции передаются в стек, то, удаляет ли вызывающая или вызываемая функция аргументы из стека в конце вызова, а также соглашение о декорировании имен, используемое компилятором для идентификации отдельных функций.
Синтаксис
/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 аргументов переменной или функций, помеченных конфликтующими или атрибутами__cdecl__stdcall__fastcall. Это соглашение о вызовах доступно только в 32- и 64-разрядных архитектурах, поддерживающих /arch:SSE2 и более поздние версии, и игнорируется компиляторами, предназначенными для архитектуры ARM.
Функции, принимающие переменное число аргументов, должны иметь пометку __cdecl.
/Gd, /Grи несовместимы с /Gv //Gz./clr:safe Параметры компилятора /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.
Выберите страницу свойств>>
Измените свойство Соглашение о вызовах.
Установка данного параметра компилятора программным способом
- См. раздел CallingConvention.