以下函数指针的分配方式:

exit = (void (*)()) &jump;

不同于:
exit = &jump;

其中exit是一个函数指针,定义为:
void (*exit) ();

'jump'是一个声明为:
void jump();

最佳答案

exit = (void (*)()) &jump;

第一个使用强制转换。 这很危险,因为它会在不通知类型是否不匹配的情况下破坏程序,因为在编译时不会被捕获。

因此,如果要执行此操作:
int func() {return 1;}
auto exit = (void (*)()) &func;

...那将是不好的。但是,最好执行以下操作:
exit = &jump;

第二个使用编译时类型检查。 这样比较安全,因为编译器将在编译时检查类型。这为您提供了更强大的类型保证。

最好的选择是使用static_cast<void(*)()> 。它是类型安全的,它可以告诉程序员更多您打算做什么的意图。
auto exit = static_cast<void(*)()>(&func);

如果您拥有C++,则可以尝试以下操作:

如果您不想担心类型,请使用auto
auto exit = &func
这将确保类型匹配。
如果要检查类型,请使用C++ 11和更高版本中存在的typeid().name中的<typeinfo>:
std::cout << typeid(exit).name << std::endl;

尽管这通常会给函数带来一些奇怪的输出,但是您可能会发现一些可以帮助您的信息,最好的一种是两种类型是否不同。

这是一个工作示例,使用函数指针强制转换在运行时显示该问题: http://coliru.stacked-crooked.com/a/47f74e8b6f389812

关于c++ - 强制转换功能指针分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31524612/

10-11 22:06
查看更多