gpt4 book ai didi

c++ - void* (*)() 和 void* 有什么区别?

转载 作者:行者123 更新时间:2023-12-01 20:25:04 29 4
gpt4 key购买 nike

在我的一个程序中,我收到错误

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com