__cdecl
Только для систем Microsoft
Это соглашение о вызовах по умолчанию для программ на языках c и C++.Поскольку стек очищен вверх вызывающим объектом, он может сделать vararg функции.__cdecl соглашение о вызовах создает большие, чем исполняемые файлы __stdcallпоскольку она требует, чтобы каждый вызов функции содержит Код очистки стека.В следующем списке показана реализация этого соглашения о вызовах.
Элемент |
Реализация |
---|---|
порядок Аргумент-проходить |
Справа налево |
ответственность за Стек-обслуживания |
Извлекает из стека вызова функции аргументы |
соглашение Имя-украшения |
Символ подчеркивания (_) присоединен префикс к именам, за исключением __cdecl экспортирования функций, компоновка c использования. |
соглашение Обращение-перевода |
Нет, выполняемого преобразования регистра |
Примечание |
---|
Дополнительные сведения см. в разделе Внутренние имена. |
Для семейства процессоров Itanium (IPF) и процессорах x64 __cdecl принимает и не обрабатывается компилятором. на IPF, по соглашению параметры передаются в регистр.
Поместитеcdecl модификатор перед именем переменной или функции.Поскольку при именовании c и соглашения о вызове значение по умолчанию, необходимо использовать только времяcdecl если указан параметр компилятора /Gz (stdcall) или /Gr (fastcall)./Gd принудительно параметр компилятора __cdecl соглашение о вызовах.
Для non-статических функций класса, если указанная функция вне линия, вызывающий модификатор соглашения не обязательно должен быть определен в определении вне линии.То есть для методов члена класса non-статических, соглашением о вызове, указанное во время объявления принято с точки зрения определения.Учитывая это определение класса
struct CMyClass {
void __cdecl mymethod();
};
this
void CMyClass::mymethod() { return; }
аналогичен этому
void __cdecl CMyClass::mymethod() { return; }
Пример
В следующем примере компилятор c# и проинструктирован использовать соглашение о вызовах для именования system функция:
// 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, ...);