void *(*routine)(void *) 在 C 中是啥意思? [复制]

Posted

技术标签:

【中文标题】void *(*routine)(void *) 在 C 中是啥意思? [复制]【英文标题】:What does void *(*routine)(void *) mean in C? [duplicate]void *(*routine)(void *) 在 C 中是什么意思? [复制] 【发布时间】:2014-02-20 01:51:24 【问题描述】:

我正在学习C,我来到了这个表达:

void *(*routine)(void *)

我觉得这很混乱。也许它是一个指针……指向一个指针……指向一个指针?

如果我想将这个东西传递给一个函数,我们将如何操作它?我正在尝试将此例程构造作为参数传递给采用 void(*)(void)... 的函数,但我对这实际上意味着什么感到迷茫。

【问题讨论】:

在这种情况下,http://cdecl.org/ 是你的朋友。 cdecl.ridiculousfish.com/?q=void+*%28*routine%29%28void+*%29 哇,感谢您的 cdecl! 请注意,cdecl 最初是一个命令行工具,它在很多地方都可用。您不必通过网站来使用 cdecl。 @PinkElephantsOnParade - 只是让你知道,以防万一我想提到这个特定的签名被用作 pthread_create API 的一部分:man7.org/linux/man-pages/man3/pthread_create.3.html 【参考方案1】:
void *(*routine)(void *);

声明一个指向函数的指针,该函数接受void *类型的参数并返回void *类型的指针


简单示例:

#include <stdio.h>

void* foo(void* x) 
    printf("Hello.");


int main(void) 
    void *(*routine)(void *);
    routine = foo;              // assings foo to our function pointer
    (*routine)(NULL);           // invokes foo using this pointer
    return 0;

输出:Hello.


“如果我想把这个东西传递给一个函数” ~ 这里是例子 2:

#include <stdio.h>

void* foo(void* x) 
    printf("Hello.");


typedef void *(*RoutinePtr)(void *);           // alias to make your life easier

void routineInvoker(RoutinePtr routine) 
    (*routine)(NULL); // invokes the routine


int main(void) 
    RoutinePtr routine = foo;   // creates a function pointer
    routineInvoker(routine);    // and passes it to our invoker
    return 0;

【讨论】:

【参考方案2】:

从最左边的标识符开始,然后继续前进,记住缺少带括号的显式分组,[] 和函数调用 () 绑定在 * 之前,所以

*a[N] 是一个 N 元素的指针数组 (*a)[N] 是一个指向 N 元素数组的指针 *f() 是一个返回指针的函数 (*f)() 是指向函数的指针

所以,

        routine             -- routine
       *routine             -- is a pointer
      (*routine)(      )    -- to a function
      (*routine)(void *)    -- taking a single parameter of type void *
     *(*routine)(void *)    -- returning a pointer
void *(*routine)(void *)    -- to void

【讨论】:

+1 关于如何阅读声明的简洁明了的解释:)

以上是关于void *(*routine)(void *) 在 C 中是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程——pthread

pthread中将处理程序送到堆栈上

Linux的POSIX线程属性

Linux——多线程编程

C/C++多线程

用户态API(pthread)