声明将在pthread_create中使用的函数 - 混淆语法错误

时间:2014-06-04 03:27:02

标签: c pthreads

我正在尝试定义一个函数,该函数将用作pthread_create的thread-start-routine参数。我写了这个:

4  void *(*Func)(void*)
5  {
6      pthread_exit(EXIT_SUCCESS);
7  }

但是GCC会在第5行打印错误:

error: expected 「=」, 「,」, 「;」, 「asm」 or 「__attribute__」 before 「{」 token

这个定义有什么问题?

2 个答案:

答案 0 :(得分:4)

问题不在于pthread_create

void *(*Func)(void*)
{
   pthread_exit(EXIT_SUCCESS);
}

不是有效的函数定义。它实际上是函数指针&func的签名。你可能想要:

void* func(void* parameter)
{
   pthread_exit(EXIT_SUCCESS);
}

答案 1 :(得分:2)

您的问题在于函数定义的语法 - 编译器认为您根本没有定义函数。

void *(*Func)(void*)
{

C的形式语法表示这是一个名为Func全局变量的定义,它是指向一个函数的指针void *参数并返回void *。这个定义缺少它的尾随分号,紧接着是函数体的开头,但是没有定义函数,所以你得到一个语法错误。

您可能您正在定义名为Func函数,并使其类型与pthread_create的thread-start-routine参数匹配。这是C声明器语法变得非常混乱的地方之一 - 它有一个逻辑,但是现在请接受我的话,你需要写一下

void *Func(void *unused) // in C++, but not in C, "unused" may be omitted
{
   pthread_exit(0); // or, equivalently, "return 0;"
}

然后你可以做

pthread_create(&PID, 0, Func, 0);

没有任何额外的箍跳,即使两个声明看起来不完全一样。

(仅供参考,它是无害的,但技术上EXIT_SUCCESS不应与pthread_exit一起使用。)