怎么在c语言中调用c++的类非静态成员函数
Contents
考虑到下面的代码。
我们有一个c库代码lib.c
,里面有个函数叫subscribe
,它接受一个callback函数指针作为参数。
1 | // lib.c |
同时在我们的c++项目中,我想去调用这个subscribe
函数,并准备传入一个非静态成员函数作为参数。
1 | class Demo { |
不幸的是,我们得到了一个编译错误,看起来像是个类型错误。
为什么会触发这个错误?
因为这个c++的非静态类成员函数有一个隐式的参数叫this.它是一个指针指向了这个类的实例对象本身。
1 | Demo* demo = new Demo(); |
上面这行代码等价于下面的这行
1 | Demo* demo = new Demo(); |
因此我们不能在c代码直接调用这个非静态类成员函数。但是类的静态成员函数没有这个约束。因为类的静态类成员函数并不和任意一个类实例对象绑定。
于是我们可以写出下面这段代码👇
1 | class Demo { |
基于上面的原理,我们可以在静态成员函数中去调用这个类的非静态成员函数。也就意味着我们可以在c代码中间接的去调用非静态成员函数。
但是要向做的这点,我们首先要解决的是如何在静态成员函数中去调用非静态成员。我们需要确保在类的静态成员中能访问到this
指针,这样我们才能调用非静态成员函数。
但是上面说过静态成员函数不和任意一个类实例对象绑定。也就是说我们无法在类静态成员函数中直接获取到this
指针,这是不是意味着这个方案死路一条?别急,我们从c++语言层面确实无法解决,但是我们可以从汇编代码入手。要确保在类静态成员函数中获取到this
指针,我们需要在调用函数之前先把this
指针保存到寄存器。然后我们再函数内部使用内联汇编的方式再从这个寄存器拿到this
指针。整个过程的伪代码如下:
1 | static int static_received(int data) { |