我正在尝试编译一些旧代码。
取决于编译器,当我尝试将函数指针分配给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
。
P.S。不能保证所有系统都可以转换为void*
。根据C ++标准,它“有条件地受支持”。保证可以在符合POSIX的系统中工作。
A void*
可以毫无困难地转换为
object指针。”>sum
中的[void* vFunPtr = sum;
不会转换为对象指针,而是函数指针。
功能指针和void *
的大小可能不同。将函数指针强制转换为void*
可能会丢失信息。类似于some_int = some_long;
。信息可能会丢失。
[vFun vFun_p = sum;
需要强制类型转换,但可以正常工作:vFun vFun_p = (vFun) sum;
。
void*
不是
通用指针
指针类型。