gpt4 book ai didi

c - 函数指针使用中的不兼容指针类型分配

转载 作者:太空狗 更新时间:2023-10-29 15:25:29 27 4
gpt4 key购买 nike

我想在我的代码中使用函数指针,代码如下。

#include <stdio.h>
#include <pthread.h>

typedef void (*PFUNC)(int);

typedef struct tag_FUNC_INFO_S
{
PFUNC callback;
int index;
} FUNC_INFO_S;

PFUNC callback_print(int index)
{
printf("[callback] index = %d\n", index);
return NULL;
}

void thread_test(FUNC_INFO_S *info)
{
info->callback(info->index);

pthread_exit(NULL);
}

int main()
{
pthread_t tid;

FUNC_INFO_S info;
info.callback = callback_print;
info.index = 777;

pthread_create(&tid, NULL, (void *)thread_test, &info);

printf("main printing\n");

return 0;
}

用“gcc -Wall xxx.c -o xxx -lpthread”编译代码后,编译器报错如下信息:

func_ptr_test.c:30:16:警告:从“PFUNC (int)”(又名“void ()(int)”)的不兼容指针类型>(int))(int)' [-Win 兼容指针类型] info.callback = callback_print;

但是,如果我将代码从

info.callback = callback_print;

info.callback = (PFUNC)callback_print;

不再有警告信息出现。但是,即使没有类型转换,我认为“info.callback”与“callback_print”的类型完全相同,所以我想知道为什么会出现警告消息。有人知道吗?

最佳答案

有时,探索表面之下的事物有助于更好地理解图片。

在 C 中,您几乎可以将函数名称视为指向该函数的指针。看看下面的例子

#include <stdio.h>

int main() {
(*printf)("test\n");
return 0;
}

在上面的代码片段中,我们可以简单地使用 printf() 而不是 (*printf)(),这实际上是您调用功能。

另一个例子是 signal() library function (是的,我是一个 FreeBSD 用户),其定义为

 void
(*signal(int sig, void (*func)(int)))(int);

当你调用signal()时,惯例是

void
handle(int sig)
{
...
}

int main(int argc, char **argv)
{
(void) signal(SIGUSR1, handle);
...
}

现在,你能看出其中的诀窍吗?尽管 signal() 被声明采用 void (*func)(int)(即指向返回 void 并采用单个 int 参数的函数的指针),我们通过该类型的函数名称作为signal() 的第二个参数。

回到您的问题,PFUNC 是指向返回 void 并采用单个 int 参数的函数的指针的别名。通过将 callback 声明为 PFUNC callback,您是在告诉您的编译器,callback 变量将指向一个返回 void 并采用单个 int 参数的函数.

所以,你应该有

void callback_print(int index) /* now you have a void ()(int) */
{
printf("[callback] index = %d\n", index);
}

匹配 info.callback = callback_print; 执行的赋值左值的预期值。

关于c - 函数指针使用中的不兼容指针类型分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51140324/

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