在 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] 而是传递它的值。