假設我有一個功能投一個函數指針
void myFun(int*)
在C++中究竟是什麼下列平均
(void(*)(void*))&myFun
它是一個指針,需要一個(void*)
作爲參數,並返回一個void
的功能?這種類型的演員是否允許?
假設我有一個功能投一個函數指針
void myFun(int*)
在C++中究竟是什麼下列平均
(void(*)(void*))&myFun
它是一個指針,需要一個(void*)
作爲參數,並返回一個void
的功能?這種類型的演員是否允許?
就目前來看,我很確定這只是不允許的。
如果去掉括號初始void
各地去:
void (*)(void *)
...那麼是的,這是一個指向函數返回void並且採用指針爲void作爲其唯一參數。要轉換爲這種類型的,你需要用括號括起來類型的完整名稱,所以你會得到:(void (*)(void *))
,你會通過價值正投跟進,得到:
(void (*)(void *))&myFun;
至少如果內存服務,是的,這是允許的,儘管通過結果解引用指針(即嘗試調用它指向的函數)可能會導致未定義的行爲。特別是,當/如果你調用這個函數時,它期望一個指向int的指針,並且將(可能)將它指向的任何內容用作int。但是,如果它指向的內容沒有正確對齊以作爲整數使用,則不太可能按預期工作。
鑄造是允許的,由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
。
這個問題上有一個錯誤,編譯器不允許使用「static_cast」。所以我應該使用reinterpret_cast或者只是使用舊的C風格演員? 不知道爲什麼這不是最好的答案,因爲是正確的^^ – GameDeveloper
@DarioOO是的,'reinterpret_cast'會比C風格的演員更清晰。 – ecatmur
你是不是指'(void(*)(void *))'?在'(void(*)(void *))&myFun'中進行類型轉換? – Managu
@Managu:* type *是'void(*)(void *)'。要轉換爲該類型,您(當然)將該類型的名稱括在括號中。我編輯澄清(至少我希望我已經使情況更清晰)。 –
謝謝。我在錯誤修正 –