簡體   English   中英

將函數作為pthread_once的參數傳遞

[英]passing function as argument to pthread_once

我正在嘗試使用pthread_once初始化一些代碼。 但是通過調用init_routine()
{1}導致編譯時警告-警告:從不兼容的指針類型傳遞'pthread_once'的參數2,而使用
{2}不發出任何警告

在file1.c中

int init_routine (void) {
 // initialize variables
}

在file1.h中

int init_routine(void);

現在我將file1.h包含在file2.c中

在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;
}

這些有什么區別?

謝謝。

(回答更新的問題)在頭文件中,您需要更改:

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開關時才會發出警告。

調用pthread_once的正確語法是:

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

因此,在您的情況下,呼叫應為:

pthread_once(&prog_inited, init_routine);

實際上, (void *)並不是必需的並且是錯誤的,因為(void *)不是函數指針類型,並且按照標准,您不可以這樣強制轉換!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM