如何在C中获取指向函数的函数指针?

如何在C中获取指向函数的函数指针?,c,pthreads,C,Pthreads,我在C中有一个函数: void start_fun() { // do something } 我想使用pthread\u create()创建一个线程,启动例程是start\u fun(),不需要修改void start\u fun(),如何获取指向start\u fun()的函数指针 如果在代码中没有任何参数的情况下编写函数名start\u fun,则会得到指向该函数的函数指针 但是,pthread_create需要一个格式为void*func(void*)的函数 如果不选择重写函数

我在C中有一个函数:

void start_fun()
{
   // do something
}

我想使用
pthread\u create()
创建一个线程,启动例程是
start\u fun()
,不需要修改
void start\u fun()
,如何获取指向
start\u fun()的函数指针

如果在代码中没有任何参数的情况下编写函数名
start\u fun
,则会得到指向该函数的函数指针

但是,pthread_create需要一个格式为
void*func(void*)
的函数

如果不选择重写函数,则必须编写包装器:

void* call_start_fun (void* dummy)
{
  (void)dummy;

  start_fun();

  return 0;
}
然后将call_start_fun传递给pthread_create:

pthread_create(&thread, NULL, call_start_fun, NULL);

函数名用作表达式,计算结果为指向命名函数的指针。因此,例如:

pthread_t thread_id;
int result = pthread_create(&thread_id, NULL, start_fun, NULL);
但是,您提供的启动函数没有正确的签名,因此将其用作pthread启动函数会产生未定义的行为。启动函数必须具有以下签名:

void *start_fun(void *arg);

如果合适,函数可以忽略其参数并始终返回
NULL
,但必须同时声明参数和返回值(这些类型)。

start\u-fun
是指向
start\u-fun
的指针。尽管。。它不是正确类型的函数
pthread\u create
需要一个
void*(*f)(void*)
。函数不是
pthread\u create
@ArjunShankar所需的正确类型。事实上,我已经修复了答案。谢谢。这只是风格的问题,但我会从
call_start_fun
@JeremyP返回
NULL
,因为结果将[任何空指针常量]强制转换为void*,因此函数将始终返回空指针常量
(void*)0
。是的,但是我得到了一个错误:从'int()()'到'void()(void)[-fppermissive]pthread\u create(&thread\u id,NULL,start\u fun,NULL)的转换无效;