c - 将函数作为参数传递给 pthread_once

标签 c

我正在尝试使用 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/

相关文章:

c - 打印数组中断错误

c - 确定矩形是否重叠,如果重叠则返回重叠矩形的面积与给定集合的比较

c - c中的段错误(核心转储)

c - 查找整数分区的字典顺序

将嵌套的 for 循环转换为 C 中的递归

C函数打印最大和最小数字

c - 可变参数异构免费宏

c - ld : warning: directory not found for option: -LC_ID_DYLIB=/usr/lib

c - txt 文件执行了一些奇怪的字符

c - 通过bindgen从Rust到C的指针: first element is always zero