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


/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

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Выберите страницу свойств>конфигурации C/C++>Advanced.

  3. Измените свойство Соглашение о вызовах.

Установка данного параметра компилятора программным способом

См. также