在编译包含对pthread_cleanup_pop(E)
宏的“调用”的C ++程序时,g ++会抛出以下错误:
error: second operand to the conditional operator is of type 'void', but the third operand is neither a throw-expression nor of type 'void'
现在,这里明显的问题是上面的宏扩展到了
(*pthread_getclean() = _pthread_cup.next, (E?_pthread_cup.func((pthread_once_t *)_pthread_cup.arg):0));}
其中第二个表达式是对返回void的函数的调用,但第三个表达式只是0。
Althoug我在这里得到了基本问题,我真的不明白为什么在这个特定用途中出现警告,因为条件的“结果”没有分配给任何东西。
为了记录:我使用MinGW-w64 3.3.0(GCC 4.9.2)编译了C ++程序,无论是否使用-std = c ++ 98。在这两种情况下,都会发生错误。如果我编译与C程序相同的代码(有或没有-std = c99),则没有错误。
除了编辑pthread.h之外,有没有人知道如何摆脱C ++中的错误?
非常感谢提前!
编辑:以下是一些示例代码供参考:
#include <pthread.h>
static int cancelled = 0;
static void test_thread_cleanup(void *_arg){
cancelled = 1;
}
static void* test_thread(void *_arg){
pthread_cleanup_push(&test_thread_cleanup, NULL); // push cleanup handler on stack
while (1){ // never left unless cancelled via pthread_cancel() from main()
pthread_testcancel(); // just test for pthread_cancel() having been called
}
pthread_cleanup_pop(1); // pop cleanup handler from stack
return NULL; // actually never reached
}
int main(void){
pthread_t th;
pthread_create(&th, NULL, &test_thread, NULL);
pthread_cancel(th);
pthread_join(th, NULL);
return cancelled;
}