我正在尝试使用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;
}
这些之间有什么区别?
感谢。
答案 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 *)
不是函数指针类型,按照标准你不允许这样的演员!