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


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

См. также

Ссылки

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

Ключевые слова C++