__cdecl
__cdecl
— это соглашение о вызовах по умолчанию для программ C и C++. Так как стек очищается вызывающим оператором, он может выполнять vararg
функции. Соглашение __cdecl
о вызове создает более крупные исполняемые файлы, чем __stdcall, так как для каждого вызова функции требуется включить код очистки стека. В следующем списке показана реализация этого соглашения о вызовах. Модификатор __cdecl
предназначен для Майкрософт.
Элемент | Внедрение |
---|---|
Порядок передачи аргументов | Справа налево. |
Обязанность по обслуживанию стека | Вызывающая функция выводит аргументы из стека. |
Соглашение об оформлении имен | Символ подчеркивания (_) префиксируется в имена, за исключением случаев, когда экспортируются __cdecl функции, использующие компоновку C. |
Соглашение о преобразовании регистра | Изменение регистра не выполняется. |
Примечание.
Дополнительные сведения см. в разделе "Декорированные имена".
Поместите __cdecl
модификатор перед переменной или именем функции. Так как соглашения об именовании и вызовах C являются стандартными, единственный раз, когда вы указали __cdecl
/Gv
параметр компилятора (vectorcall), /Gz
или /Gr
(fastcall). Параметр компилятора /Gd заставляет соглашение о вызове __cdecl
.
В процессорах ARM и x64 принимается, __cdecl
но обычно игнорируется компилятором. По соглашению на ARM и x64 аргументы передаются в регистрах, когда это возможно, а последующие аргументы передаются в стек. В коде x64 используйте __cdecl
для переопределения параметра компилятора /Gv и использования соглашения о вызовах x64 по умолчанию.
Если используется внестрочное определение нестатической функции класса, то модификатор соглашения о вызовах не должен быть задан во внестрочном определении. То есть для нестатических методов-членов считается, что соглашение о вызовах, указанное во время объявления, было сделано в точке определения. Рассмотрим следующее определение класса:
struct CMyClass {
void __cdecl mymethod();
};
вид:
void CMyClass::mymethod() { return; }
эквивалентен следующему:
void __cdecl CMyClass::mymethod() { return; }
Для совместимости с предыдущими версиями cdecl и _cdecl являются синонимом__cdecl
, если не указан параметр компилятора /Za (Отключить расширения языка).
Пример
В следующем примере компилятору дается инструкция использовать для функции system
соглашения об именовании и вызовах C:
// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);
См. также
Передача аргументов и соглашения об именовании
Ключевые слова
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по