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


/Gd, /Gr, /Gz (соглашения о вызовах)

Обновлен: Ноябрь 2007

Данные параметры определяют порядок, в котором аргументы функции передаются в стек, вызывающая или вызываемая функция удаляет аргументы из стека в конце вызова, а также соглашение об именах, используемое компилятором для идентификации отдельных функций.

 /Gd /Gr /Gz

Заметки

46t77ak2.alert_note(ru-ru,VS.90).gifПримечание.

Данные параметры компилятора доступны только в компиляторах для платформы 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.

46t77ak2.alert_note(ru-ru,VS.90).gifПримечание.

Для процессоров x86 функции-члены С++ по умолчанию используют __thiscall.

Для всех процессоров функция-член, которая явно помечена как __cdecl, __fastcall или __stdcall, использует указанное соглашение о вызовах. Функция-член, которая принимает переменное число аргументов, всегда использует соглашение о вызовах __cdecl.

Особенности __cdecl

Для языка С в соглашении об именах __cdecl используется имя функции, которому предшествует символ подчеркивания ( _ ). Изменения регистра не происходит. Функции C++ используют другую схему именования, если только они не объявлены как extern "C". Дополнительные сведения см. в разделе Внутренние имена.

Особенности __fastcall

Некоторые аргументы функции __fastcall передаются в регистрах (для процессоров x86, ECX и EDX), а остальные передаются в стек справа налево. Вызываемая процедура извлекает из стека эти аргументы до возвращения. Как правило, параметр /Gr снижает время выполнения.

46t77ak2.alert_note(ru-ru,VS.90).gifПримечание.

Следует соблюдать осторожность при использовании соглашения о вызовах __fastcall для любой функции, написанной на языке встроенной сборки. Использование регистров не должно конфликтовать с их использованием компилятором.

Для языка C соглашение об именах __fastcall использует имя функции, которому предшествует символ @. Затем следует размер аргументов функции в байтах. Изменения регистра не происходит. Компилятор использует следующий шаблон для соглашения об именах.

@function_name@number

При использовании соглашения об именах __fastcall следует использовать стандартные включаемые файлы. В противном случае могут образоваться неразрешаемые внешние ссылки.

Особенности __stdcall

Аргументы функции __stdcall передаются в стек справа налево, а вызываемая функция извлекает эти аргументы перед возвращением.

Для языка С соглашение об именах __stdcall использует имя функции, которому предшествует символ подчеркивания ( _ ) и за которым следует знак "@" и размер аргументов функции в байтах. Изменения регистра не происходит. Компилятор использует следующий шаблон для соглашения об именах.

_functionname@number

Специфика для платформы x86

Данный параметр не используется для именования методов и функций C++. Методы и функции C++ используют другую схему именования, если только они не объявлены как extern "C". Дополнительные сведения см. в разделе Внутренние имена.

Дополнительные сведения о соглашениях о вызовах см. в разделе Calling Conventions.

Специфика для платформы x86 — окончание

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

  1. Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Открытие свойств страниц проекта.

  2. Щелкните папку C/C++.

  3. Выберите страницу свойств Дополнительно.

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

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

См. также

Ссылки

Параметры компилятора

Настройка параметров компилятора