如何解决将C ++类成员函数作为参数传递给C函数
我正在c ++类中使用c dll。成员函数之一应调用以下函数,该函数生成中断并调用服务例程:
signed short __stdcall SetIrqConditions
(
signed short DevNum,unsigned short bEnable,unsigned int dwIrqMask,void (__stdcall * funcExternalIsr)
(
signed short DevNum,unsigned int dwIrqStatus
)
);
我试图调用与此函数的最后一个参数相同类的另一个成员函数。(funcExternalIsr)当我尝试执行此操作时,编译器抱怨该函数不是静态的。因此,我将被调用方函数定义为静态函数,但是当我这样做时,我无法访问该类的其他成员。
class myClass
{
public:
int counter;
void func1();
static void __stdcall func2(signed short DevNum,unsigned int Status);
};
void myClass::func1()
{
...
Result = SetIrqConditions(DevNum,TRUE,Mask,func2); --> no error here once func2 is static
}
void myClass::func2(signed short DevNum,unsigned int Status)
{
counter++; --> invalid use of member 'counter' in static member function
}
我尝试了许多不同的方法并进行了一些研究,但我似乎无法使它正常工作,任何朝着正确方向发展的指针将不胜感激。
解决方法
将C ++类成员函数作为参数传递给C函数
无法使用非静态函数来执行此操作,因为C没有诸如指向成员函数的指针之类的东西。 C仅具有指向函数的指针,而不能指向非静态成员函数。
您可以做的是编写一个单独的自由包装函数(或静态成员函数),在其中调用该非静态成员函数。示例:
void wrapper_function(demo args)
{
instance.member_function(args);
}
剩下的问题是在包装器中从何处获取类实例。这些选项通常是:
- 将其作为参数传递给包装器。这通常是带有
void*
参数且设计良好的C样式回调的选项。此处似乎并非如此。 - 在静态存储中使用变量。这是不理想的,因为全球国家是邪恶的。
- 在包装器中创建一个本地自动变量。当需要在其他位置访问实例状态时,这通常没有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。