【问题标题】:How to set function address of C++ class method for non-C++ function calls?如何为非C++函数调用设置C++类方法的函数地址?
【发布时间】:2016-07-22 20:25:44
【问题描述】:

openssl 库提供了一种编写您自己的 BIO 的方法。本质上,您加载一个函数指针结构,以读取、写入、创建、销毁等,openssl 库将使用的例程。

我正在尝试将此功能包装在 C++ 类中。 openssl 有例程来设置它使用的结构的函数指针,例如:

BIO_meth_set_read(pBIOMethod, my_function_for_read); 

问题:我可以为 my_function_for_read 使用类方法吗?换句话说,类方法的地址是否可以在基于 C 的外部库中作为常规函数调用?

如果我只取那个类方法的地址,我不确定是否使用了类 vtable。

谢谢, -安德烈斯

【问题讨论】:

  • 你想调用C库中某个类的方法吗?如果是这样,你不能因为 C 不知道类实例。但是你可以调用类的静态方法。无论如何,请检查此技术stackoverflow.com/questions/14815274/…

标签: c++11 openssl


【解决方案1】:

您可以调用静态成员函数,可以将其包装在简单的 C 函数中。例如:

a.cc:

#include <stdio.h>

class C {
public:
  static void hello();
};

void C::hello()
{
  printf("hello\n");
}

extern "C" {
  void hi()
  {
    C::hello();
  }
}

b.c:

extern void hi();

int main()
{
  hi();
}

然后:

g++ -c -o a.o a.cc
gcc b.c a.o
./a.out
hello

在静态成员函数中,你可以做任何你喜欢的C++。例如,将参数转换为指向 C 实例的指针,然后调用成员函数等。

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2015-04-18
    • 2019-03-25
    相关资源
    最近更新 更多