C 分配给'的指针类型不兼容;无效(*)(无效*)和#x27;从';int(int*)和#x27 ;;

C 分配给'的指针类型不兼容;无效(*)(无效*)和#x27;从';int(int*)和#x27 ;;,c,pointers,C,Pointers,我已经在下面用C编写了代码,但是在p=getNext上得到了警告 从“int(int*)”分配给“void(*)(void*)”的指针类型不兼容 我试着用计算机来解决它 p = (void *)getNext; 它起作用了。但我不知道为什么它会起作用。(void*)是否将getNext强制转换为可以返回未定义类型数据的新函数? 有人能解释一下吗?getNext是int-getNext(int*p)类型的函数,它会衰减为指向int(*)(int*)类型函数的指针。这与其他指针类型不兼容,需要强制

我已经在下面用C编写了代码,但是在
p=getNext上得到了警告

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

我试着用计算机来解决它

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

getNext
int-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中被允许作为扩展,POSIX具有
dlsym
函数,该函数返回一个
void*
,该函数可以指向函数或类似对象。

getNext
是一个
int-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中被允许作为一个扩展,POSIX中有
dlsym
函数,它返回一个
void*
,可以指向一个函数或类似的对象。

想一想你正在尝试做什么。为什么不呢看到错误消息了吗?是什么让你认为不同类型的
p
getNext
可以一起工作?这种类型转换会导致代码具有未定义的行为。函数指针定义的语法是
(*)(函数参数);
。返回类型和函数参数不适合您的函数
getNext
!请稍微考虑一下您正在尝试执行的操作。为什么您认为会收到错误消息?是什么让您认为不同类型的
p
getNext
可以一起工作?该强制转换将导致代码未定义函数指针定义的语法是
(*)(函数参数);
。返回类型和函数参数不适合您的函数
getNext
!注意名称回调已在Windows上使用,因此您可能需要选择其他名称。注意名称回调已在Windows上使用,因此您可能需要选择其他名称。