cdecl и extern "C"
Подскажите, пожалуйста, верно ли я понимаю следующее.
extern "C"- отключает искажение имен, например, при экспортировании функций вDLL;cdecl- описывает технические особенности вызова.
То есть, если я экспортирую функции в DLL, мне нужно использовать и extern "C", и cdecl?
Ответы (2 шт):
extern "C" отключает искажение имен и обеспечивает возможность вызова функции из программы, написанной на C. А также из других программ, которые могут вызывать API: .NET PInvoke, Assembly, Delphy итд.
Для клиента на C++ extern "C" не обязтельно. Без этого объявления можно использовать function overloading. extern "C" ислючает эту возможность.
cdecl это станартный Calling Convention, подходящий для всех клиентов. Можно использовать другие конвенции, если клиент их понимает. Например конвенция WinAPI - stdcall
Самое главное отличие - стратегия передачи и обработки параметров
Зачастую это пользователю конечно безразлично, но тем не менее об этом надо помнить
__cdecl - Caller Pushes parameters on the stack, in reverse order (right to left)
__stdcall - Caller Pushes parameters on the stack, in reverse order (right to left)
__fastcall - Caller Stored in registers, then pushed on stack