我有一个库(C ++),它有一些API函数。其中一个被声明为__cdecl,但从__stdcall获取一个函数poiner。类似的东西:
typedef int (__stdcall *Func)(unsigned char* buffer);
//...
int ApiFunc(Func funcPtr); //This is __cdecl since it is an 'extern "C"' library and the calling convention is not specified
然后 - 我有一个使用此库的C ++可执行项目,但不调用上述API或使用Func
类型。
将Func
的调用约定更改为__stdcall
后,出现以下编译错误:
错误C2995: 'std :: pointer_to_unary_function< _Arg,_Result,_Result(__ cdecl *)(_ Arg)> std :: ptr_fun(_Result(__ cdecl *)(_ Arg))':function 模板已经存在 定义了c:\ program files \ microsoft visual studio 8 \ vc \ include \ functional
知道它会是什么吗?
提前致谢!!
答案 0 :(得分:2)
错误..他们不相容。您必须在呼叫的两侧指定相同的呼叫约定。否则,试图打电话会炸毁机器堆栈。
答案 1 :(得分:2)
它们兼容,至少在Windows中(并且在Linux中根本没有__stdcall ...) 问题是错误地,库重新定义了__stdcall以与Linux兼容,如:
#ifndef __MYLIB_WIN32
//Just an empty define for Linux compilation
#define __stdcall
#endif
exe项目包含此定义,并且未在其中定义__MYLIB_WIN32,但仅在库中定义。 将上述定义更改为:
#ifndef WIN32
//Just an empty define for Linux compilation
#define __stdcall
#endif
一切正常。
谢谢大家。