【问题标题】:incompatible pointer types assigning to 'void (*)(void *)' from 'int (int *)'从“int (int *)”分配给“void (*)(void *)”的不兼容指针类型
【发布时间】:2020-09-10 15:39:35
【问题描述】:

我在下面用 C 语言编写了代码,但在 p = getNext; 上收到警告

从 'int (int *)' 分配给 'void (*)(void *)' 的不兼容指针类型

int getNext(int *p){
    return rand();
}
void testFunc(void (* p)(void *)){
    printf("right!\n");
}
int main(int argc, char const *argv[])
{
    void (*p)(void *);
    p = getNext;
    testFunc(p);
    return 0;
}

我试图解决它

p = (void *)getNext;

它有效。但我不知道为什么它会起作用。 (void *) 是否将getNext 转换为可以返回未定义类型数据的新函数? 谁能解释一下?

【问题讨论】:

  • 想一想你想要做什么。为什么你认为你收到错误信息?是什么让您认为pgetNext 的不同类型可以一起工作?并且该演员导致您的代码具有未定义的行为
  • 函数指针定义的语法是<return_type> (*<pointer_name>) (function_arguments);。返回类型和函数参数不适合您的函数getNext!

标签: c pointers


【解决方案1】:

getNextint getNext(int *p) 类型的函数,它衰减到指向int (*)(int *) 类型函数的指针。这与您的其他指针类型不兼容,您需要进行强制转换。因此:

void (*p)(void *);
p = (void (*)(void*))getNext;

问题在于,当您通过指针调用函数时,您必须将其转换回原始类型......也许您打算在任何地方使用int (*p)(int *);


typedef 简化了处理函数指针。例如:

typedef int (*CALLBACK)(int *);

void testFunc(CALLBACK p){
    printf("right!\n");
}

...
    CALLBACK p = getNext;
    testFunc(p);

在标准 C 中转换为 void * 然后再转换为函数是双重无效的,但它在 POSIX 中被允许作为扩展,它具有返回 void *dlsym 函数可以指向到一个函数或一个类似的对象。

【讨论】:

  • 请注意名称 CALLBACK 已在 Windows 上使用,因此您可能需要选择其他名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多