我正在尝试定义一个函数,该函数将用作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
这个定义有什么问题?
答案 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
一起使用。)