2012-01-06 96 views
0

說我有在C-庫返回布爾值到C-環境

int (*fptr)(void); 

一個函數指針和我有在C++類

class A { static int func(); } 

我可以做以下,這將是安全的任何平臺

ftpr = A::func; 

上我想爲A::func()返回bool

class A { static bool func(); } 

,我不介意鑄造

fptr = reinterpret_cast<int(*)()>(A::func); 

但它會是任何平臺上安全嗎?乍一看,它似乎會(只要sizeof(bool) <= sizeof(int)),但我不太確定。

+0

請注意http fomatting ate type reinterpret_cast – zzz777 2012-01-06 18:07:39

+0

僅供參考:您可以縮進四個空格的代碼以將其格式化爲代碼。 – 2012-01-06 18:10:08

回答

4

不,鑄造函數指針是不安全的。通過錯誤類型的函數指針調用函數會產生未定義的行爲。

如果您需要您的C++代碼與C代碼進行互操作,請不要在您的界面中使用C++ bool類型(或者對於C語言沒有的其他C++類型)。

+0

感謝您的確切答案:我會將int作爲返回值推送到客戶端代碼,或者將寫入一個輕量級的C++包裝器。 – zzz777 2012-01-06 18:17:58

+0

此外,確保從C調用的任何函數具有正確的調用約定:即使通過指針調用該函數也必須聲明爲extern「C」(typedef)。包括靜態成員在內的成員不能被外部「C」。 – 2012-01-06 19:10:16

+0

@dietmar你能證實你的意見嗎?我的理解是,extern「C」沒有任何超越名稱修飾的作用(我沒有使用第三方庫,所有相關代碼(boht c和C++)中的更多內容將由同一編譯器編譯爲共同的構建 – zzz777 2012-01-08 02:33:56