2012-10-04 82 views
1

Possible Duplicate:
void pointers: difference between C and C++C++的類型轉換錯誤

嗨,我有以下功能:

void task2(int a) 
{ 
    printf(" Task 2 running..\n"); 
    sleep(2); 
    printf(" Task 2 exiting..\n"); 
} 

thpool_add_work(threadpool, (void*)task2, (void*)a); 

int thpool_add_work(thpool_t* tp_p, void *(*function_p)(void*), void* arg_p) 
{ 
    // some code here 
} 

上面的代碼使用C效果很好,但在C並不++編譯。我收到以下錯誤:

error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’ 
error: initializing argument 2 of ‘int thpool_add_work(thpool_t*, void* (*)(void*), void*)’ 

我無法弄清楚這個錯誤的原因。任何想法爲什麼當我將文件擴展名更改爲CPP並編譯時出現此錯誤?

+1

您需要發佈更多的代碼 - 比如功能和對象的聲明。 –

+0

是不是因爲'void *'可以在'C'中隱式轉換,而不是在'C++'中? – verdesmarald

+0

在C++中,將數據指針(即'void *')轉換爲函數指針(即'void *(*)(void *)')是不合法的。然而,許多編譯器會讓你擺脫這一點。我會刪除或調整你在調用'thread_add_work'時調用的'task2'。我也會刪除似乎無用的'a'的'(void *)'類型。太多的演員總是一個不好的跡象,它只是隱藏錯誤 – john

回答

0

嘗試此

thpool_add_work(threadpool, (void* (*)(void*))task2, (void*)a); 

Ç自動轉換void*於任何類型的,C++沒有。

你可以用一個typedef提高代碼

typedef void* (*worker_func_t)(void*); 

thpool_add_work(threadpool, (worker_func_t)task2, (void*)a); 

int thpool_add_work(thpool_t* tp_p, worker_func_t function_p, void* arg_p) 
{ 
    // some code here 
} 
2

你必須改變的task2簽名匹配thpool_add_work參數的類型:

void* task2(void* a) 

它創建的線程將調用成爲

thpool_add_work(threadpool, task2, &a); 

假設aint

如果你需要使用的task2的說法,你可以做以下操作:

int ia = *(int*)a; 

更新回答OP評論

thpool_add_work願與void*說法是有原因的功能。以這種方式,您可以將任何類型的參數傳遞給線程函數,儘管採用類型不安全的方式。

將參數地址轉換爲void*作爲thpool_add_work的第三個參數。之後,您將指向void的指針投射回指向您預期的參數類型的指針,並將其取消引用以獲取該參數的值。我給的例子爲int a以上,那就現在怎麼尋找一個浮動:

void* test3(void* a) 
{ 
float fa = *(float*)a; 
..... 
return NULL; 
} 
+0

中task2的內容,task2需要將其轉換爲int,並且task3需要將void *轉換爲float。我不知道如何將參數更改爲void * a會有所幫助。你能否詳細說明一下? – webgenius

+0

@webgenius:答案已更新 – Andrey