在 pthread_create 中使用函数指针数组 - 接近初始化
Using function pointer array in pthread_create - near initialization
编辑:这已在 John Bollinger 和 alk 的帮助下得到解答。在下面阅读他们的评论!我还在原始 post 的底部包含了我修改后的代码,供任何搜索阅读
的人使用
我正在尝试使用函数指针数组作为 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);
}
改变
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]
而是传递它的值。
编辑:这已在 John Bollinger 和 alk 的帮助下得到解答。在下面阅读他们的评论!我还在原始 post 的底部包含了我修改后的代码,供任何搜索阅读
的人使用我正在尝试使用函数指针数组作为 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);
}
改变
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]
而是传递它的值。