PThreads报错void *(*)()与void *(*)(void *)类型不兼容求解
报错原因
你遇到的类型不匹配报错,核心原因是pthread_create要求传入的线程入口函数有固定签名:void* (*)(void*),即返回值为void*、接收一个void*类型的入参。
你编写的sample函数参数列表为空,类型为void* (*)(),和要求的函数指针类型不兼容,因此编译器抛出错误。
部分老旧编译环境会放宽空参数函数的类型检查,因此旧教程中的不规范写法在老环境下可能偶然运行成功,但新版本编译器(包括你当前使用的VS环境)会执行严格类型校验,直接拦截这类不匹配问题。该报错和你提到的「未删除头文件317行内容」的操作无关,你本地对应位置不存在该行内容,说明你使用的pthread版本本身就不需要做这个修改。
修复方案
修改sample函数的定义,使其签名完全匹配pthread的要求:即使你不需要使用传入的参数,也必须在形参列表声明void*类型的形参,同时补全void*类型的返回值(无有效返回内容时返回NULL即可)。
修正后的完整代码
#include <pthread.h> #include <stdio.h> #include <stdlib.h> // 匹配pthread要求的线程入口函数签名 void* sample(void* arg) { printf("Thread sample. \n"); return NULL; } int main(void) { pthread_t tid; pthread_create(&tid, NULL, sample, NULL); pthread_join(tid, NULL); return 0; }
补充说明
pthread_create第三个参数传入线程函数时,直接写函数名即可,函数名会自动隐式转换为函数指针,额外加取地址符&不会触发错误但属于冗余写法。- 只要你已经完成了VS中pthread库的头文件路径、链接库路径、依赖项配置,替换上述代码后即可正常编译运行,不需要额外修改pthread头文件内容。
内容的提问来源于stack exchange,提问作者Ken
相关产品推荐
相关产品推荐

