混合调用约定会导致编译错误

时间:2010-06-29 13:42:48

标签: c++ compiler-errors stdcall cdecl

我有一个库(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

知道它会是什么吗?

提前致谢!!

2 个答案:

答案 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

一切正常。

谢谢大家。