如何實現一個帶有可變參數(n個參數)的函數,例如:void * thre(int,...);在pthread_create內部(& thr,NULL,thre,???) 提前致謝。pthread_create()中帶有可變參數的函數?
0
A
回答
1
設置了線程處理函數的原型。它必須是void* (*)(void*)
。你不能傳遞一個接受別的東西的函數,即使是在投射時也是如此,因爲這將是未定義行爲的原因。
但POSIX允許你單個參數void*
,這個參數足以傳遞任何東西的地址,因此不是那種限制。
所以,如果你想傳遞一些額外的參數,他們捆綁在一個結構:
struct my_data {
int n;
char c;
double d;
};
void *variable_argument_function (int first_arg, ...) {
return NULL;
}
void* handler(void *vdata) {
struct my_data *data = vdata;
return variable_argument_function(data->n,
data->c,
data->d);
//use data->n, data->c, data->d
}
int main(void) {
struct my_data t_data = {
.n = 1, .c = 'a', .d = 3.14
};
pthread_t t;
if (pthread_create(&t, NULL, &handler, &t_data) == 0)
pthread_join(t, NULL);
return 0;
}
+0
@YasserNezzari - 如果我收集正確,那麼是的。就像我在更新的代碼片段中那樣做。 – StoryTeller
+0
非常感謝你,這就是我需要的! –
我不太確定你想要什麼,但解決的辦法可能是使用軟件工程的基本定理:添加一個間接的級別。 – StoryTeller
NVM,覺得我明白了。 – StoryTeller