什么是函数指针的void *?

问题描述 投票:0回答:3

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

取决于编译器,当我尝试将函数指针分配给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*泛化为函数,我也很高兴。

c++ c casting function-pointers void-pointers
3个回答
4
投票
什么是函数指针的void *?

以某种方式:所有指向函数的指针。

关于指向void的指针的特殊之处在于它可以指向任何对象,并且任何对象的指针都可以转换为指向void并返回的指针,这将产生原始指针。

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


以另一种方式:在没有这样的指针类型的情况下,对于函数指针没有类似的指针类型,所有函数指针类型都将隐式转换为与对象指针隐式转换为void*相同的方式。


我该如何解决?

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

P.S。不能保证所有系统都可以转换为void*。根据C ++标准,它“有条件地受支持”。保证可以在符合POSIX的系统中工作。


3
投票
没有为函数指针设计的通用类型。但是,您可以使用任何函数指针类型。 C标准说,任何函数指针都可以转换为任何函数指针类型。 (当然,只有在用于调用的类型与该函数的实际定义兼容的情况下,才使用转换后的指针来调用该函数。)

1
投票
在C中,

A void*可以毫无困难地转换为

object指针。”>sum中的[void* vFunPtr = sum;不会转换为对象指针,而是函数指针。

功能指针和void *的大小可能不同。将函数指针强制转换为void*可能会丢失信息。类似于some_int = some_long;。信息可能会丢失。

[vFun vFun_p = sum;需要强制类型转换,但可以正常工作:vFun vFun_p = (vFun) sum;

void*不是

通用指针

指针类型。
© www.soinside.com 2019 - 2024. All rights reserved.