错误:从“void(FlashWork::*)(int,siginfo\u t*,void*)”转换为“void*(*)(int,siginfo\u t*,void*)” 我是Linux上的C程序员,但现在我有一个C++项目,有个问题。

错误:从“void(FlashWork::*)(int,siginfo\u t*,void*)”转换为“void*(*)(int,siginfo\u t*,void*)” 我是Linux上的C程序员,但现在我有一个C++项目,有个问题。,c++,c,linux,signals,C++,C,Linux,Signals,下面是示例代码 g_action.sa_sigaction = (void(*)(int,siginfo_t*,void*))&FlashWork::Disconnect_action; 当我尝试在x86上编译它时,它工作得很好,但是在arm上我得到了以下错误 错误:从void FlashWork转换::*int,siginfo\u t*,void*到void*int,siginfo\u t*,void* 我做错了什么?您的函数是返回void的成员函数。它应该是非成员函数或返回voi

下面是示例代码

g_action.sa_sigaction = (void(*)(int,siginfo_t*,void*))&FlashWork::Disconnect_action; 
当我尝试在x86上编译它时,它工作得很好,但是在arm上我得到了以下错误

错误:从void FlashWork转换::*int,siginfo\u t*,void*到void*int,siginfo\u t*,void*


我做错了什么?

您的函数是返回void的成员函数。它应该是非成员函数或返回void的静态成员函数*

您的函数是返回void的成员函数。它应该是非成员函数或返回void*

成员指针的静态成员函数与函数指针不兼容,除非它是静态成员。原因是指向成员的指针需要一个对象—在您的案例中是FlashWork对象。

指向成员的指针与指向函数的指针不兼容,除非它是静态成员。原因是,指向一个成员的指针需要一个对象,在您的情况下需要一个闪存对象。

除了函数返回值不同之外,在C++中,当你有一个成员函数不是静态的:

时,你应该知道。 C程序员喜欢看到的真正特征是:

void (*)(FlashWork *, int, siginfo_t *, void *)
该FlashWork*参数是一个隐藏指针,可通过以下方式引用

所以,

void (FlashWork::*)(int, siginfo_t*, void*)


有不同的参数数。

< P>除了函数返回值不同之外,在C++中,当你有一个不是静态的成员函数:

时,你应该知道。 C程序员喜欢看到的真正特征是:

void (*)(FlashWork *, int, siginfo_t *, void *)
该FlashWork*参数是一个隐藏指针,可通过以下方式引用

所以,

void (FlashWork::*)(int, siginfo_t*, void*)


有不同数量的参数。

实际上,即使它是静态的,也不会有SAU信号所需的外部C链接。大多数实现都允许它,但它不是强制要求的。@awoodland,extern C与名称混乱不相关吗?如果函数指针中有函数的地址,而没有函数的名称,那么这怎么会是一个问题呢anymore@Shahbaz:理论上,它也会影响调用约定,并在重载解析中考虑。这就是为什么C++定义了q排序的两个重载。@沙赫巴兹-这不仅仅是名字的修饰,它们在理论上仍然是不同的类型。很高兴知道,我从来没有想过它实际上即使是静态的,它仍然不会有SAU信号所需的外部C链接。大多数实现都允许它,但它不是强制要求的。@awoodland,extern C与名称混乱不相关吗?如果函数指针中有函数的地址,而没有函数的名称,那么这怎么会是一个问题呢anymore@Shahbaz:理论上,它也会影响调用约定,并在重载解析中考虑。这就是为什么C++定义了q排序的两个重载。@沙赫巴兹-这不仅仅是名字的修饰,它们在理论上仍然是不同的类型。很高兴知道,我从来没有想过头中的错误消息与问题文本中的代码和错误消息不匹配。标头在目标类型的返回类型中有一个额外的*值,即void*,而不是void。问题正文是sigaction的正确函数类型。标题中的错误消息与问题文本中的代码和错误消息不匹配。标头在目标类型的返回类型中有一个额外的*值,即void*,而不是void。问题正文是sigaction的正确函数类型。将额外参数放在第一位可能会产生误导。您也不能将&FlashWork::disconnect\u操作转换为void*FlashWork*、int、siginfo\u t*、void*,因此这不是真正的签名。在任何给定的实现中,成员函数的调用约定可能看起来与作为第一个参数传递的自由函数相同,也可能不同。@SteveJessop,对。我只是想指出,这也是一个参数。我一直认为这是第一个参数。很高兴知道。例如,在Windows/x86上,除非使用fastcall约定,否则非成员调用的所有参数都会在堆栈上传递,但对于公共API调用则不是。这是在寄存器ECX中传递的,这是使用fastcall时的第一个参数。但是在这个调用中,所有其他参数都在堆栈上,而在fastcall中,第二个参数在EDX中。因此,使用此参数的调用约定与将其作为第一个参数添加到其他两个调用约定中的任何一个并不相同。将额外的参数放在第一位可能会产生误导。您也不能将&FlashWork::disconnect\u操作转换为void*FlashWork*、int、siginfo\u t*、void*,因此这不是真正的签名。在任何给定的实现中,成员函数的调用约定可能看起来与作为第一个参数传递的自由函数相同,也可能不同。@SteveJessop,对。我只是想
指出这也是一个参数。我一直认为这是第一个参数。很高兴知道。例如,在Windows/x86上,除非使用fastcall约定,否则非成员调用的所有参数都会在堆栈上传递,但对于公共API调用则不是。这是在寄存器ECX中传递的,这是使用fastcall时的第一个参数。但是在这个调用中,所有其他参数都在堆栈上,而在fastcall中,第二个参数在EDX中。因此,使用此函数的调用约定与将其作为第一个参数添加到其他两个调用约定中的任意一个并不相同。