2012-01-06 60 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