开发者

Mixed calling conventions make compilation errors

开发者 https://www.devze.com 2023-01-04 22:44 出处:网络
I have a library (C++) which has some API functions. One of them is declared as __cdecl, but gets a function poiner from __stdcall. Something like:

I have a library (C++) which has some API functions. One of them is declared as __cdecl, but gets a function poiner from __stdcall. Something like:

typedef  int (__stdcall *Func)(unsigned char* buffer);
//...
int ApiFunc(Func funcPtr); //This is __cdecl since it is an 'extern "C"' library and the开发者_JAVA技巧 calling convention is not specified

Then - I have a C++ executable project which uses this library, but doesn't call the above API or uses the Func type.

After changing the calling convention of Func to __stdcall, I get the following compilation error:

error C2995: 'std::pointer_to_unary_function<_Arg,_Result,_Result(__cdecl *)(_Arg)> std::ptr_fun(_Result (__cdecl *)(_Arg))' : function template has already been defined c:\program files\microsoft visual studio 8\vc\include\functional

Any idea what could it be?

Thanks in advance!!


Err.. they're incompatible. You have to specify the same calling convention on both sides of the call. Otherwise attempting to call will blow up the machine stack.


They ARE compatible, in Windows at least (and in Linux there isn't __stdcall at all...) The problem was that by mistake, the library re-defined __stdcall for compatibility with Linux, as:

#ifndef __MYLIB_WIN32
//Just an empty define for Linux compilation
#define __stdcall
#endif

The exe project includes this definition, and __MYLIB_WIN32 was not defined in it, but in the library only. Changing the above definition to:

#ifndef WIN32
//Just an empty define for Linux compilation
#define __stdcall
#endif

and everything works fine.

Thank you all.

0

精彩评论

暂无评论...
验证码 换一张
取 消