在许多情况下,C 框架使用函数指针来扩展功能并通知侦听器(例如 win32-api 和 GLUT)。在编写面向对象的 C++ 时,您更喜欢使用类和对象来处理这个问题。所以我的问题是:
使用指向 C 库需要函数指针的静态方法的指针是否安全?
形式上,不,你不能这样做,但实际上,是的。要从 C 代码调用,必须标记 C++ 函数extern "C"
,以确保它使用 C 编译器期望的调用约定。无法将静态成员函数标记为extern "C"
,因此无法保证它可以从 C 代码中成功调用。我不知道有一个编译器不会对静态成员函数使用与 C 代码相同的调用约定,所以这会起作用。一些编译器会针对这种情况产生警告,因为从技术上讲,函数的类型错误。事实上,如果你看一下 C++ 标准,接受回调的 C 函数(qsort
例如 )有两个版本:一个接受一个extern "C"
函数,一个接受一个extern "C++"
函数。