将函数作为参数传递给pthread_once

时间:2014-02-12 22:09:51

标签: c

我正在尝试使用pthread_once来初始化一些代码。但是通过
调用init_routine() {1}导致编译时警告 - 警告:从不兼容的指针类型传递'pthread_once'的参数2,而使用
{2}没有发出任何警告

在file1.c中

int init_routine (void) {
 // initialize variables
}

在file1.h

int init_routine(void);

现在我在file2.c中包含file1.h

在file2.c

#include "file1.h"

pthread_once_t prog_inited = PTHREAD_ONCE_INIT;

int start() {
...
pthread_once(&prog_inited, &init_routine);        <-- {1} 
pthread_once(&prog_inited, (void *)init_routine); <-- {2}

...
return 0;
}

这些之间有什么区别?

感谢。

2 个答案:

答案 0 :(得分:1)

(对更新问题的回答)在头文件中,您需要更改:

int init_routine(void);

void init_routine(void);

pthread_once之前对&的调用不需要init_routine

pthread_once(&prog_inited, init_routine);

但你最初拥有的是,

pthread_once(&prog_inited, (void *)init_routine);
正如cnicutar所指出的那样,

并不是严格合法的C代码,但它仍然适用于当今常用的几乎所有编译器。例如,gcc只会发出警告,并且只有在您使用-pedantic开关时才会发出警告。

答案 1 :(得分:0)

调用pthread_once的正确语法是:

int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));

所以在你的情况下,呼叫需要是:

pthread_once(&prog_inited, init_routine);

(void *)实际上没有必要和错误,因为(void *)不是函数指针类型,按照标准你不允许这样的演员!