我正在尝试使用 pthread_once 来初始化一些代码。但是通过
调用 init_routine()
{1} 导致编译时警告 - 警告:从不兼容的指针类型传递“pthread_once”的参数 2,而使用
{2} 不发出任何警告
在文件1.c中
int init_routine (void) {
// initialize variables
}
在文件1.h中
int init_routine(void);
现在我将 file1.h 包含在 file2.c 中
在文件2.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;
}
它们之间有什么区别?
谢谢。
最佳答案
(回答更新的问题)在头文件中,您需要更改:
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
开关时才会发出警告。
关于c - 将函数作为参数传递给 pthread_once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21740871/