__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, ...);

См. также

Передача аргументов и соглашения об именовании
Ключевые слова