/Gd, /Gr, /Gz (соглашения о вызовах)
Данные параметры определяют порядок, в котором аргументы функции передаются в стек, вызывающая или вызываемая функция удаляет аргументы из стека в конце вызова, а также соглашение об именах, используемое компилятором для идентификации отдельных функций.
/Gd
/Gr
/Gz
Заметки
Примечание |
---|
Данные параметры компилятора доступны только в компиляторах для платформы x86. Они недоступны в компиляторах для x64 или Itanium. |
/Gd (параметр по умолчанию) указывает соглашение о вызовах __cdecl для всех функций за исключением функций-членов C++ и функций, помеченных как __stdcall или __fastcall.
/Gr указывает соглашение о вызовах__fastcall для всех функций за исключением функций-членов C++ и функций, помеченных как __cdecl или __stdcall.Все функции __fastcall должны иметь прототипы.
/Gz указывает соглашение о вызовах __stdcall для всех функций за исключением функций-членов C++ и функций, помеченных как __cdecl или __fastcall.Все функции __stdcall должны иметь прототипы.
Функция, принимающая переменное число аргументов, должна быть помечена как __cdecl.
/Gd, /Gr и /Gz несовместимы с /clr:safe или /clr:pure.
Примечание |
---|
Для процессоров x86 функции-члены С++ по умолчанию используют __thiscall. |
Для всех процессоров функция-член, которая явно помечена как __cdecl, __fastcall или __stdcall, использует указанное соглашение о вызовах.Функция-член, которая принимает переменное число аргументов, всегда использует соглашение о вызовах __cdecl.
Особенности __cdecl
Для языка С в соглашении об именах __cdecl используется имя функции, которому предшествует символ подчеркивания ( _ ). Изменения регистра не происходит.Функции C++ используют другую схему именования, если только они не объявлены как extern "C".Дополнительные сведения см. в разделе Внутренние имена.
Особенности __fastcall
Некоторые аргументы функции __fastcall передаются в регистрах (для процессоров x86, ECX и EDX), а остальные передаются в стек справа налево.Вызываемая процедура извлекает из стека эти аргументы до возвращения.Как правило, параметр /Gr снижает время выполнения.
Примечание |
---|
Следует соблюдать осторожность при использовании соглашения о вызовах __fastcall для любой функции, написанной на языке встроенной сборки.Использование регистров не должно конфликтовать с их использованием компилятором. |
Для языка C соглашение об именах __fastcall использует имя функции, которому предшествует символ @. Затем следует размер аргументов функции в байтах.Изменения регистра не происходит.Компилятор использует следующий шаблон для соглашения об именах.
@function_name@number
При использовании соглашения об именах __fastcall следует использовать стандартные включаемые файлы.В противном случае могут образоваться неразрешаемые внешние ссылки.
Особенности __stdcall
Аргументы функции __stdcall передаются в стек справа налево, а вызываемая функция извлекает эти аргументы перед возвращением.
Для языка С соглашение об именах __stdcall использует имя функции, которому предшествует символ подчеркивания ( _ ) и за которым следует знак "@" и размер аргументов функции в байтах.Изменения регистра не происходит.Компилятор использует следующий шаблон для соглашения об именах.
_functionname@number
Специфика для платформы x86
Данный параметр не используется для именования методов и функций C++.Методы и функции C++ используют другую схему именования, если только они не объявлены как extern "C".Дополнительные сведения см. в разделе Внутренние имена.
Дополнительные сведения о соглашениях о вызовах см. в разделе Соглашения о вызовах.
Специфика для платформы x86 — окончание
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта.Дополнительные сведения см. в разделе Открытие свойств страниц проекта.
Откройте папку C/C++.
Выберите страницу свойств Дополнительно.
Измените свойство Соглашение о вызовах.
Установка данного параметра компилятора программным способом
- Дополнительные сведения см. в разделе CallingConvention.