— Пер.
Читатель, никогда не встречавшийся с соглашениями о вызовах, может задаться вопросом: почему существуют различные их типы?. Различия между вызовами _cdecl и _stdcall довольно тонкие. При стандартном вызове вызываемая функция очищает стек, поэтому она должна точно "знать" количество ожидаемых параметров. В связи с этим функция стандартного вызова не может иметь переменного числа аргументов (как, например, printf). Поскольку для функций _cdeci стек очищает вызывающая программа, функции с переменным числом аргументов допустимы. Стандартный вызов используется по умолчанию для системных функций Win32, а также для функций языка Visual Basic.
Соглашение о вызове
|
Передача параметров
|
Поддержка стека
|
Декорирование имен
|
Замечания
|
_cdecl
|
Справа налево
|
Аргументы из стека удаляет вызывающая программа. Это единственное соглашение о вызовах, которое допускает переменные списки аргументов
|
Символ подчеркивания в качестве префикса перед именами функций, как в_Роо
|
Используется по умолчанию для функций С и C++
|
_ stdcall
|
Справа налево
|
Свои собственные аргументы из стека удаляет сама вызванная функция
|
Символ подчеркивания в качестве префикса перед именами функций и суффикс @ , за которым следует десятичное число байт в списке аргументов, как в_Роо@12
|
Используется почти всеми системными функциями и, по умолчанию, внутренними функциями Visual Basic
|
_ fastcall
|
Два первых DWORD-параметра передаются в регистрах ЕСХ и EDX; остальные передаются справа налево
|
Аргументы из стека удаляет вызывающая функция
|
Префикс @ перед именем и суффикс @ после него, за которым следует десятичное число байт в списке аргументов, как в ®Foo@12
|
Применяется только в Intel CPU. Это соглашение о вызовах используется по умолчанию для компиляторов Borland Delphi
|
this
|
Справа налево. Параметр this передается в регистре ЕСХ
|
Аргументы из стека удаляет вызывающая функция
|
Нет
|
Используется автомат-ски методами классов C++, если не указан стандартный вызов. Все СОМ-методы объявляются со стандартным вызовом
|