2013-11-26 28 views
0

今天我已經瞭解到,函數指針和數據指針是不一樣的,因此彼此不兼容(Why are function pointers and data pointers incompatible in C/C++?)。然而,我的問題是,不同的函數(非成員)指針彼此兼容(以相同的方式實現)。不同的函數指針是否相互兼容?

在代碼:

typedef void(*FuncPtr0)(); 
typedef void(*FuncPtr1)(int); 

FuncPtr0 p0; 
FuncPtr1 p1; 

p0 = reinterpret_cast<FuncPtr0>(p1); // will this always work, if p1 really 
p0();         // points to a function of type FuncPtr0 

感謝您的幫助!

回答

9

n3376 5.2.10/6

函數指針可以顯式轉換爲不同類型的函數指針。通過指向函數類型(8.3.5)的指針調用 函數的效果與函數的定義 中使用的類型不同。除了將「指針指向T1」類型的prvalue轉換爲類型「指向 T2的指針」(其中T1和T2是函數類型)並且返回到其原始類型以產生原始指針值之外,此類指針轉換的結果是不確定的。

+0

非常感謝!似乎很容易找到這個問題的答案。請問你,你是如何去尋找標準中的引文的? – rozina

+0

@rozina只是看看段落,那就是reinterpret_cast。 – ForEveR

+0

我GOOGLE了,發現標準不是免費的,這就解釋了爲什麼沒有谷歌搜索結果顯示標準只有在這裏引用stackoverflow :)但再次感謝! – rozina

1

不,它們不兼容,將調用未定義的行爲。你將有不明確的結果。

事實上,你可以將它們轉換爲對方,但不應該調用指向非兼容函數簽名的函數指針。 例如,見this code

typedef void(*FuncPtr0)(); 

void p1f()  { std::cout << "ONE";  } 
void p2f(int x) { std::cout << "TWO " << x ; } 

int main() 
{ 
    FuncPtr0 p0 = reinterpret_cast<FuncPtr0>(p2f); 
    p0(); 
} 

輸出

TWO 1 

的問題是誰設置參數x1?它可能會運行,但結果是未指定的。在我的系統中,結果是其他東西(垃圾)TWO 39