在我的一个程序中,我收到错误
invalid conversion from 'void* (*)()' to 'void*' [-fpermissive]
我试图理解这两种数据类型之间的区别。这很令人困惑。
我认为这些数据类型是:
void* (*)()
所以这个数据类型是一个指向 void (void*
) 的指针,它还有另一个指针 ((*)
>),并且出于某种奇怪的原因,它有空括号。所以我想象这种数据类型的内存看起来像 |--void 地址--|--未知类型的指针--|--表示没有参数的东西--|
然后是void*
。这看起来很简单,它只代表了一个函数的地址。内存模型应该像 |--void address--|
一样简单。
为什么这么奇怪,是因为抛出错误的函数如下。
void callFunction(void *voidThing){
void *testVariable = voidThing;
}
据我所知,这创建了一个指针类型的 testVariable,并且该指针指向 void。 该函数还接受一个指针类型的参数,该指针也是指向 void 的。
即使局部变量与参数类型相同,为什么编译器会抛出错误?就两者的内存占用而言,这两个变量有什么区别?
最佳答案
这些是类型:
void *
- 指向 void 的指针(可以指向任何对象,但不能指向函数)void * ()
- 不带参数并返回void *
的函数
void * (*) ()
- 指向不带参数并返回void *
的函数的指针
上述各项的标识符声明示例:
void *object_ptr; // variable: pointer to object
void *function(); // function (not a variable)
void * (*function_pointer)(); // variable: pointer to function
函数类型的语法将标识符放在参数列表之前,数组也会发生类似的情况。这称为中缀表示法。
指针声明符是后缀,即标识符位于*
之后。
在 void * (*) ()
中,第一组括号是必需的,因为 void * *()
将是不同的类型(声明语法导致 void * *
呆在一起)。
callFunction
函数本身是正确的,但是错误消息可能来自于尝试使用不正确的参数调用它,例如函数的地址。 void *
只能保存对象的地址。
某些平台可能允许使用reinterpret_cast
将对象指针转换为函数指针,反之亦然,此功能有条件地支持实现定义的语义,这意味着实现可能允许也可能不允许,但如果允许,则必须记录行为。
关于c++ - void* (*)() 和 void* 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60107782/