我正在尝试编译一些旧代码。
根据编译器的不同,当我尝试将函数指针分配给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中,
void*
可以毫不费力地转换为对象指针。
与void* vFunPtr = sum;
一样,sum
不转换为对象指针,而是转换为函数指针。
函数指针和CCD_ 10可以具有不同的大小。将函数指针投射到void*
可能会丢失信息。Akin至some_int = some_long;
。信息可能会丢失。
vFun vFun_p = sum;
需要类型转换,但在其他方面有效:vFun vFun_p = (vFun) sum;
。
void*
不是通用指针指针类型。