函数指针的空白*是什么?



我正在尝试编译一些旧代码。

根据编译器的不同,当我尝试将函数指针分配给void*指针时,会收到此警告/错误:

warning: a value of type "double (*)(double, double)" cannot be assigned to an entity of type "void *"
error: invalid conversion from ‘double (*)(double, double)’ to ‘void*’

我认为旧代码过去是在旧编译器上编译的,但我知道这些代码是非法的,不应该编译。我想知道函数是否也有void*。到目前为止,我已经尝试过了:

double sum(double a, double b){return a+b;}
typedef double(*dDd)(double, double);
typedef void(*vFun)(void);
dDd   funPtr  = sum;  // compiles and works
void* vFunPtr = sum;  // does not compile   
vFun  vFun_p  = sum;  // does not compile   

但是它无法编译。

我该怎么解决这个问题?如果void*也能推广到函数,我会很高兴。

函数指针的void*是什么?

在某种程度上:指向函数的所有指针。

指向void的指针的一个特殊之处在于,它可以指向任何对象,并且任何对象指针都可以转换为指向void和返回的指针,从而生成原始指针。

所有指向函数的指针都可以转换为指向函数类型的其他指针,然后再转换回原来的值。


另一方面:函数指针没有类似的指针类型,因为没有这样的指针类型所有函数指针类型都会以与对象指针隐式转换为void*相同的方式隐式转换。


如何修复此问题?

如果需要,请使用强制转换显式转换指针。在C++中使用reinterpret_cast

第页。S.转换为void*并不能保证在所有系统上都能工作,因此不是通用的可移植性。根据C++标准,它是"有条件支持的"。它保证在符合POSIX的系统中工作。

函数指针没有指定的泛型类型。然而,你可以使用任何函数指针类型。C标准规定,任何函数指针都可以转换为任何函数指针。(当然,只有当用于调用的类型与函数的实际定义兼容时,才定义使用转换后的指针来调用函数。(

在C中,

void*可以毫不费力地转换为对象指针。

void* vFunPtr = sum;一样,sum不转换为对象指针,而是转换为函数指针。

函数指针和CCD_ 10可以具有不同的大小。将函数指针投射到void*可能会丢失信息。Akin至some_int = some_long;。信息可能会丢失。

vFun vFun_p = sum;需要类型转换,但在其他方面有效:vFun vFun_p = (vFun) sum;

void*不是通用指针指针类型。

最新更新