Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 作为函数指针的静态方法_C++_C_Oop - Fatal编程技术网

C++ 作为函数指针的静态方法

C++ 作为函数指针的静态方法,c++,c,oop,C++,C,Oop,在许多情况下,C框架使用函数指针来扩展功能并通知侦听器(例如win32 api和GLUT)。当编程面向对象C++时,你更喜欢使用类和对象来处理这个问题。所以我的问题是: 在C库需要函数指针的情况下,使用指向静态方法的指针是否安全?正式地说,不,您不能这样做,但实际上,是的。若要从C代码中调用,则必须将C++函数标记为代码>外部“C”< /代码>,以确保它使用C编译器期望的调用约定。无法将静态成员函数标记为extern“C”,因此无法保证可以从C代码成功调用它。我不知道有哪种编译器对静态成员函数的

在许多情况下,C框架使用函数指针来扩展功能并通知侦听器(例如win32 api和GLUT)。当编程面向对象C++时,你更喜欢使用类和对象来处理这个问题。所以我的问题是:


在C库需要函数指针的情况下,使用指向静态方法的指针是否安全?

正式地说,不,您不能这样做,但实际上,是的。若要从C代码中调用,则必须将C++函数标记为代码>外部“C”< /代码>,以确保它使用C编译器期望的调用约定。无法将静态成员函数标记为
extern“C”
,因此无法保证可以从C代码成功调用它。我不知道有哪种编译器对静态成员函数的调用约定与对C代码的调用约定不同,所以这是可行的。有些编译器会针对这种情况发出警告,因为从技术上讲,函数的类型是错误的。事实上,如果你看C++标准,C函数接受回调(例如,代码> qSoS< <代码> >有两个版本:一个采用<代码>外部“C”/Cuff>函数,一个采用<代码>外部“C++”< C++ >函数。

我相信,在C++ 11中,在创建新线程时,静态函数是线程过程。我确信调用约定(stdcall、fastcall等)可能会有问题。我相信其他人不会在他们的iPhone上提供一个很好的深入的答案!(关于“引用”,如果库需要函数指针,则应使用函数指针)。