下面的代码可以在我找到的任何在线 gcc 编译器(gcc 9.2.0)上正确运行,它也可以在 CYGWIN gcc 编译器上正确运行,但不幸的是它不能与 MINGW gcc 编译器一起正常工作 - 看起来它传递了无效参数为“ this”到“methodA”和“methodB”方法,当它们被调用时,而不是预期的结果(56,58)我得到一些随机的高数字。
#include <iostream>
using namespace std;
class CallbackBase
{
public:
using METHOD_TYPE = int (CallbackBase::*)(...);
};
class CallbackProvider : public CallbackBase
{
public:
int methodA(int a,int b,int c)
{
return a+b+c+d;
}
int methodB(double a,double b,double c)
{
return a+b+c+d;
}
private:
int d=8;
};
class CallbackRunner
{
public:
CallbackBase::METHOD_TYPE m_method;
CallbackBase* m_this;
void install (CallbackBase* _this, CallbackBase::METHOD_TYPE _method)
{
m_method =_method;
m_this =_this;
}
int Run1()
{
return (m_this->*m_method)(15L,16L,17L);
}
int Run2()
{
return (m_this->*m_method)(15.6,16.7,17.8);
}
};
int main()
{
CallbackProvider cp;
CallbackRunner cr;
cr.install(&cp,(CallbackBase::METHOD_TYPE)&CallbackProvider::methodA);
cout << "result " << cr.Run1() << endl;
cr.install(&cp,(CallbackBase::METHOD_TYPE)&CallbackProvider::methodB);
cout << "result " << cr.Run2() << endl;
return 0;
}
如果我将 __cdecl 属性添加到此方法,问题就解决了:
int __cdecl methodA(int a,int b,int c)
int __cdecl methodB(double a,double b,double c)
我不使用-mrtd 编译标志。据此, __cdecl 应该是 gcc 编译器的默认调用约定,但对于 MINGW 来说似乎并非如此。
是否可以将 __cdecl 设置为我的项目的默认调用约定?或者作为替代方案,有没有办法为所有方法设置“默认”属性?
我正在使用具有 64 位架构的 Windows 10。