编辑:这是在John Bollinger和alk的帮助下回答的。阅读下面的评论!对于任何想要阅读的人来说,我还在原始帖子的底部包含了修改后的代码
我尝试使用函数指针数组作为pthread_create中的函数参数发送,但是当我尝试编译时(使用:" gcc -std = c99 P1.c -lpthread"我收到以下错误:
P1.c:40:1:警告:从不兼容的指针类型初始化[默认启用]
func_ptr funcs [4] = {func0,func1,func2,func3};
P1.c:40:1:警告:(接近初始化' funcs [0]')[默认启用]
P1.c:40:1:警告:从不兼容的指针类型初始化[默认启用]
P1.c:40:1:警告:(接近初始化' funcs [1]')[默认启用]
P1.c:40:1:警告:从不兼容的指针类型初始化[默认启用]
P1.c:40:1:警告:(接近初始化' funcs [2]')[默认启用]
P1.c:40:1:警告:从不兼容的指针类型初始化[默认启用]
P1.c:40:1:警告:(接近初始化' funcs [3]')[默认启用]
我认为我的函数指针的typedef声明存在问题,但我无法确切地知道问题是什么。以下是相关的代码段:
void func0()
{ printf("A"); }
void func1()
{ printf("B"); }
void func2()
{ printf("C"); }
void func3()
{ printf("D"); }
typedef void* (*func_ptr)(void *);
func_ptr funcs[4] = {func0, func1, func2, func3};
int main(int argc, char *argv[])
{
pthread_t pth[THREADCNT];
for(int i =0; i < THREADCNT; i++)
pthread_create(&pth[i], NULL, (funcs[i])(), NULL);
for(int i =0; i < THREADCNT; i++)
pthread_join(pth[i], NULL);
}
以下修订的工作代码
// changed these functions to void* with (void * pv) parameter to
// match the typedef (and also match the pthread_create parameter)
void* func0(void * pv)
{ printf("A"); }
void* func1(void * pv)
{ printf("B"); }
void* func2(void * pv)
{ printf("C"); }
void* func3(void * pv)
{ printf("D"); }
typedef void* (*func_ptr)(void *);
func_ptr funcs[4] = {func0, func1, func2, func3};
int main(int argc, char *argv[])
{
pthread_t pth[THREADCNT];
for(int i =0; i < THREADCNT; i++)
pthread_create(&pth[i], NULL, funcs[i], NULL);
// changed the funcs[i] because the function isn't called, the value is just passed as an argument
for(int i =0; i < THREADCNT; i++)
pthread_join(pth[i], NULL);
}
答案 0 :(得分:2)
更改
void func0()
是
void * func0(void * pv)
(其他三个相同)
因为这是定义要保存的数组的类型,以及pthread_create()
所期望的类型。
更改
pthread_create(&pth[i], NULL, (funcs[i])(), NULL);
是
pthread_create(&pth[i], NULL, funcs[i], NULL);
因为您不想调用funcs[i]
但是要传递其值。