Приведенный ниже код работает правильно с любым онлайн-компилятором g cc, который я нашел (g cc 9.2.0), он также правильно работает с компилятором CYGWIN g cc, но, к сожалению, он не работает с Компилятор MINGW g cc - похоже, он передает недопустимый параметр как "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 флаг компиляции . Согласно this , __cdecl должен быть соглашением о вызовах по умолчанию для компиляторов g cc, но похоже, что это не так для MINGW.
Возможно ли установить __cdecl в качестве соглашения о вызовах по умолчанию для моего проекта? или в качестве альтернативы, есть ли способ установить атрибут «по умолчанию» для всех методов?
Я использую Windows 10 с 64-битной архитектурой.