2012-06-28 74 views
2

假設我有一個功能投一個函數指針

void myFun(int*)
在C++中究竟是什麼下列平均


    (void(*)(void*))&myFun 

它是一個指針,需要一個(void*)作爲參數,並返回一個void的功能?這種類型的演員是否允許?

回答

4

就目前來看,我很確定這只是不允許的。

如果去掉括號初始void各地去:

void (*)(void *) 

...那麼是的,這是一個指向函數返回void並且採用指針爲void作爲其唯一參數。要轉換爲這種類型的,你需要用括號括起來類型的完整名稱,所以你會得到:(void (*)(void *)),你會通過價值正投跟進,得到:

(void (*)(void *))&myFun; 

至少如果內存服務,是的,這是允許的,儘管通過結果解引用指針(即嘗試調用它指向的函數)可能會導致未定義的行爲。特別是,當/如果你調用這個函數時,它期望一個指向int的指針,並且將(可能)將它指向的任何內容用作int。但是,如果它指向的內容沒有正確對齊以作爲整數使用,則不太可能按預期工作。

+0

你是不是指'(void(*)(void *))'?在'(void(*)(void *))&myFun'中進行類型轉換? – Managu

+0

@Managu:* type *是'void(*)(void *)'。要轉換爲該類型,您(當然)將該類型的名稱括在括號中。我編輯澄清(至少我希望我已經使情況更清晰)。 –

+0

謝謝。我在錯誤修正 –

3

鑄造是允許的,由5.2.10(6):

的函數指針可以被顯式轉換爲二FF erent類型的函數指針。通過指向函數類型(8.3.5)的指針調用 函數的功能未定義,該指針與函數的定義 中使用的類型不同。除了將「指針指向T1」類型的prvalue轉換爲類型「指向 T2的指針」(其中T1和T2是函數類型)並且回到其原始類型產生原始指針值之後,這種指針轉換的結果將會變爲 沒有具體說明。

這相當於到C 6.3.2.3(8):

一個指針,指向一個類型的函數可被轉換成一個指針到另一個 類型並再次返回的函數;結果應與原始指針相等。如果使用轉換後的 指針調用其類型與指向類型 不兼容的函數,則行爲未定義。

實際上,通過具有不同但兼容參數類型(特別是指針類型)的函數指針調用通常會成功,並且對參數具有C風格轉換的效果。然而,這絕不是保證; https://stackoverflow.com/a/189126/567292討論了一個情況,gcc決定讓這樣一個未定義的函數指針投入調用abort

+0

這個問題上有一個錯誤,編譯器不允許使用「static_cast」。所以我應該使用reinterpret_cast或者只是使用舊的C風格演員? 不知道爲什麼這不是最好的答案,因爲是正確的^^ – GameDeveloper

+1

@DarioOO是的,'reinterpret_cast'會比C風格的演員更清晰。 – ecatmur