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