2010-06-29 5 views
2

일부 API 기능이있는 라이브러리 (C++)가 있습니다. 그 중 하나는 __cdecl로 선언되지만 __stdcall에서 함수 호출자를 가져옵니다. 뭔가 같이 : 다음혼합 호출 규칙으로 컴파일 오류가 발생합니다

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 

-이 라이브러리를 사용하지만, 위의 API를 호출하지 않거나 Func 형식을 사용하는 C++ 실행 가능한 프로젝트가 있습니다.

__stdcallFunc의 호출 규칙을 변경 한 후, 나는 다음과 같은 컴파일 오류가 얻을 :

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

어떤 생각이 무엇을 할 수 있을까?

미리 감사드립니다.

답변

1

오류 .. 호환되지 않습니다. 통화의 양쪽에서 동일한 호출 규칙을 지정해야합니다. 그렇지 않으면 전화를 걸어 기계 스택을 날려 버릴 것입니다.

1

그들은 Windows에서 적어도 (리눅스에서 ... 모두가 __stdcall되지 않음), 호환 문제 실수로, 라이브러리로, 리눅스와의 호환성을 위해 __stdcall을 다시 정의이었다 :

#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 

모든 것이 잘 작동합니다.

감사합니다.

관련 문제